merge with ns-3-dev

This commit is contained in:
Gustavo J. A. M. Carneiro
2007-09-24 11:09:17 +01:00
9 changed files with 197 additions and 66 deletions

View File

@@ -85,6 +85,7 @@ Ipv4EndPointDemux::Allocate (void)
}
Ipv4EndPoint *endPoint = new Ipv4EndPoint (Ipv4Address::GetAny (), port);
m_endPoints.push_back (endPoint);
NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
return endPoint;
}
@@ -92,7 +93,7 @@ Ipv4EndPoint *
Ipv4EndPointDemux::Allocate (Ipv4Address address)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << address << ")");
NS_LOG_PARAM ("(" << this << ", " << address << ")");
uint16_t port = AllocateEphemeralPort ();
if (port == 0)
{
@@ -101,6 +102,7 @@ Ipv4EndPointDemux::Allocate (Ipv4Address address)
}
Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
m_endPoints.push_back (endPoint);
NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
return endPoint;
}
@@ -115,7 +117,7 @@ Ipv4EndPoint *
Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << address << ", " << port << ")");
NS_LOG_PARAM ("(" << this << ", " << address << ", " << port << ")");
if (LookupLocal (address, port))
{
NS_LOG_WARN ("Duplicate address/port; failing.");
@@ -123,6 +125,7 @@ Ipv4EndPointDemux::Allocate (Ipv4Address address, uint16_t port)
}
Ipv4EndPoint *endPoint = new Ipv4EndPoint (address, port);
m_endPoints.push_back (endPoint);
NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
return endPoint;
}
@@ -150,6 +153,9 @@ Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort,
Ipv4EndPoint *endPoint = new Ipv4EndPoint (localAddress, localPort);
endPoint->SetPeer (peerAddress, peerPort);
m_endPoints.push_back (endPoint);
NS_LOG_DEBUG ("Now have >>" << m_endPoints.size () << "<< endpoints.");
return endPoint;
}
@@ -175,7 +181,8 @@ Ipv4EndPointDemux::DeAllocate (Ipv4EndPoint *endPoint)
*/
Ipv4EndPointDemux::EndPoints
Ipv4EndPointDemux::Lookup (Ipv4Address daddr, uint16_t dport,
Ipv4Address saddr, uint16_t sport)
Ipv4Address saddr, uint16_t sport,
Ptr<Ipv4Interface> incomingInterface)
{
NS_LOG_FUNCTION;
uint32_t genericity = 3;
@@ -187,28 +194,32 @@ Ipv4EndPointDemux::Lookup (Ipv4Address daddr, uint16_t dport,
for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++)
{
NS_LOG_LOGIC ("Ipv4EndPointDemux::Lookup against " <<
(*i)->GetLocalAddress ()
<< ":" <<
(*i)->GetLocalPort ()
<< " " <<
(*i)->GetPeerAddress ()
<< ":"
<< (*i)->GetPeerPort ());
NS_LOG_DEBUG ("Looking at endpoint dport=" << (*i)->GetLocalPort ()
<< " daddr=" << (*i)->GetLocalAddress ()
<< " sport=" << (*i)->GetPeerPort ()
<< " saddr=" << (*i)->GetPeerAddress ());
if ((*i)->GetLocalPort () != dport)
{
NS_LOG_LOGIC ("Skipping endpoint " << &(*i)
<< " because endpoint dport "
<< (*i)->GetLocalPort ()
<< " does not match packet dport " << dport);
continue;
}
bool isBroadcast =
(daddr.IsBroadcast () ||
daddr.IsSubnetDirectedBroadcast (incomingInterface->GetNetworkMask ()));
NS_LOG_DEBUG ("dest addr " << daddr << " broadcast? " << isBroadcast);
NS_LOG_LOGIC ("Local address matches: " <<
bool ((*i)->GetLocalAddress () == daddr || daddr.IsBroadcast ()));
bool ((*i)->GetLocalAddress () == daddr || isBroadcast));
NS_LOG_LOGIC ("Peer port matches: " <<
bool ((*i)->GetPeerPort () == sport || sport == 0));
bool ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0));
NS_LOG_LOGIC ("Peer address matches: " <<
bool ((*i)->GetPeerAddress () == saddr ||
(*i)->GetPeerAddress () == Ipv4Address::GetAny ()));
if ( ((*i)->GetLocalAddress () == daddr || daddr.IsBroadcast ())
if ( ((*i)->GetLocalAddress () == daddr || isBroadcast)
&& ((*i)->GetPeerPort () == sport || (*i)->GetPeerPort () == 0)
&& ((*i)->GetPeerAddress () == saddr || (*i)->GetPeerAddress () == Ipv4Address::GetAny ()))
{

View File

@@ -25,6 +25,7 @@
#include <stdint.h>
#include <list>
#include "ns3/ipv4-address.h"
#include "ipv4-interface.h"
namespace ns3 {
@@ -43,7 +44,8 @@ public:
EndPoints Lookup (Ipv4Address daddr,
uint16_t dport,
Ipv4Address saddr,
uint16_t sport);
uint16_t sport,
Ptr<Ipv4Interface> incomingInterface);
Ipv4EndPoint *Allocate (void);
Ipv4EndPoint *Allocate (Ipv4Address address);

View File

@@ -546,11 +546,13 @@ Ipv4L3Protocol::Receive( Ptr<NetDevice> device, const Packet& p, uint16_t protoc
NS_LOG_LOGIC ("Packet from " << from);
uint32_t index = 0;
Ptr<Ipv4Interface> ipv4Interface;
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin ();
i != m_interfaces.end ();
i++)
{
if ((*i)->GetDevice () == device)
ipv4Interface = *i;
if (ipv4Interface->GetDevice () == device)
{
m_rxTrace (p, index);
break;
@@ -572,7 +574,7 @@ Ipv4L3Protocol::Receive( Ptr<NetDevice> device, const Packet& p, uint16_t protoc
}
NS_LOG_LOGIC ("Forward up");
ForwardUp (packet, ipHeader);
ForwardUp (packet, ipHeader, ipv4Interface);
}
@@ -745,14 +747,15 @@ Ipv4L3Protocol::Forwarding (
}
void
Ipv4L3Protocol::ForwardUp (Packet p, Ipv4Header const&ip)
Ipv4L3Protocol::ForwardUp (Packet p, Ipv4Header const&ip,
Ptr<Ipv4Interface> incomingInterface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &p << ", " << &ip << ")");
Ptr<Ipv4L4Demux> demux = m_node->QueryInterface<Ipv4L4Demux> (Ipv4L4Demux::iid);
Ptr<Ipv4L4Protocol> protocol = demux->GetProtocol (ip.GetProtocol ());
protocol->Receive (p, ip.GetSource (), ip.GetDestination ());
protocol->Receive (p, ip.GetSource (), ip.GetDestination (), incomingInterface);
}
void

View File

@@ -227,7 +227,7 @@ private:
Packet const &packet,
Ipv4Header &ipHeader,
Ptr<NetDevice> device);
void ForwardUp (Packet p, Ipv4Header const&ip);
void ForwardUp (Packet p, Ipv4Header const&ip, Ptr<Ipv4Interface> incomingInterface);
uint32_t AddIpv4Interface (Ptr<Ipv4Interface> interface);
void SetupLoopback (void);

View File

@@ -26,6 +26,7 @@
#define IPV4_L4_PROTOCOL_H
#include "ns3/object.h"
#include "ipv4-interface.h"
namespace ns3 {
@@ -59,13 +60,15 @@ public:
* \param p packet to forward up
* \param source source address of packet received
* \param destination address of packet received
* \param incomingInterface the Ipv4Interface on which the packet arrived
*
* Called from lower-level layers to send the packet up
* in the stack.
*/
virtual void Receive(Packet& p,
Ipv4Address const &source,
Ipv4Address const &destination) = 0;
Ipv4Address const &destination,
Ptr<Ipv4Interface> incomingInterface) = 0;
protected:
virtual void DoDispose (void);
private:

View File

@@ -123,8 +123,9 @@ UdpL4Protocol::DeAllocate (Ipv4EndPoint *endPoint)
void
UdpL4Protocol::Receive(Packet& packet,
Ipv4Address const &source,
Ipv4Address const &destination)
Ipv4Address const &source,
Ipv4Address const &destination,
Ptr<Ipv4Interface> interface)
{
NS_LOG_FUNCTION;
NS_LOG_PARAM ("(" << &packet << ", " << source << ", " << destination <<
@@ -134,7 +135,7 @@ UdpL4Protocol::Receive(Packet& packet,
packet.RemoveHeader (udpHeader);
Ipv4EndPointDemux::EndPoints endPoints =
m_endPoints->Lookup (destination, udpHeader.GetDestination (),
source, udpHeader.GetSource ());
source, udpHeader.GetSource (), interface);
for (Ipv4EndPointDemux::EndPointsI endPoint = endPoints.begin ();
endPoint != endPoints.end (); endPoint++)
{

View File

@@ -85,7 +85,8 @@ public:
// inherited from Ipv4L4Protocol
virtual void Receive(Packet& p,
Ipv4Address const &source,
Ipv4Address const &destination);
Ipv4Address const &destination,
Ptr<Ipv4Interface> interface);
protected:
virtual void DoDispose (void);
private:

View File

@@ -332,3 +332,132 @@ UdpSocket::ForwardUp (const Packet &packet, Ipv4Address ipv4, uint16_t port)
}
} //namespace ns3
#ifdef RUN_SELF_TESTS
#include "ns3/test.h"
#include "ns3/internet-node.h"
#include "ns3/socket-factory.h"
#include "ns3/udp.h"
#include "ns3/simulator.h"
#include "ns3/point-to-point-channel.h"
#include "ns3/point-to-point-net-device.h"
#include "ns3/drop-tail-queue.h"
#include <string>
namespace ns3 {
class UdpSocketTest: public Test
{
Packet m_receivedPacket;
Packet m_receivedPacket2;
public:
virtual bool RunTests (void);
UdpSocketTest ();
void ReceivePacket (Ptr<Socket> socket, const Packet &packet, const Address &from);
void ReceivePacket2 (Ptr<Socket> socket, const Packet &packet, const Address &from);
};
UdpSocketTest::UdpSocketTest ()
: Test ("UdpSocket") {}
void UdpSocketTest::ReceivePacket (Ptr<Socket> socket, const Packet &packet, const Address &from)
{
m_receivedPacket = packet;
}
void UdpSocketTest::ReceivePacket2 (Ptr<Socket> socket, const Packet &packet, const Address &from)
{
m_receivedPacket2 = packet;
}
bool
UdpSocketTest::RunTests (void)
{
bool result = true;
// Create topology
// Receiver Node
Ptr<Node> rxNode = Create<InternetNode> ();
Ptr<PointToPointNetDevice> rxDev = Create<PointToPointNetDevice> (rxNode);
rxDev->AddQueue(Create<DropTailQueue> ());
Ptr<Ipv4> ipv4 = rxNode->QueryInterface<Ipv4> (Ipv4::iid);
uint32_t netdev_idx = ipv4->AddInterface (rxDev);
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.1"));
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U));
ipv4->SetUp (netdev_idx);
// Sender Node
Ptr<Node> txNode = Create<InternetNode> ();
Ptr<PointToPointNetDevice> txDev = Create<PointToPointNetDevice> (txNode);
txDev->AddQueue(Create<DropTailQueue> ());
ipv4 = txNode->QueryInterface<Ipv4> (Ipv4::iid);
netdev_idx = ipv4->AddInterface (txDev);
ipv4->SetAddress (netdev_idx, Ipv4Address ("10.0.0.2"));
ipv4->SetNetworkMask (netdev_idx, Ipv4Mask (0xffff0000U));
ipv4->SetUp (netdev_idx);
// link the two nodes
Ptr<PointToPointChannel> channel = Create<PointToPointChannel> ();
rxDev->Attach (channel);
txDev->Attach (channel);
// Create the UDP sockets
Ptr<SocketFactory> rxSocketFactory = rxNode->QueryInterface<SocketFactory> (Udp::iid);
Ptr<Socket> rxSocket = rxSocketFactory->CreateSocket ();
NS_TEST_ASSERT_EQUAL (rxSocket->Bind (InetSocketAddress (Ipv4Address ("10.0.0.2"), 1234)), 0);
rxSocket->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket, this));
Ptr<SocketFactory> txSocketFactory = txNode->QueryInterface<SocketFactory> (Udp::iid);
Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
// ------ Now the tests ------------
// Unicast test
m_receivedPacket = Packet ();
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("10.0.0.1"), 1234),
Packet (123)), 0);
Simulator::Run ();
NS_TEST_ASSERT_EQUAL (m_receivedPacket.GetSize (), 123);
// Simple broadcast test
m_receivedPacket = Packet ();
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234),
Packet (123)), 0);
Simulator::Run ();
NS_TEST_ASSERT_EQUAL (m_receivedPacket.GetSize (), 123);
// Broadcast test with multiple receiving sockets
// When receiving broadcast packets, all sockets sockets bound to
// the address/port should receive a copy of the same packet.
Ptr<Socket> rxSocket2 = rxSocketFactory->CreateSocket ();
rxSocket2->SetRecvCallback (MakeCallback (&UdpSocketTest::ReceivePacket2, this));
NS_TEST_ASSERT_EQUAL (rxSocket2->Bind (InetSocketAddress (Ipv4Address ("0.0.0.0"), 1234)), 0);
m_receivedPacket = Packet ();
m_receivedPacket2 = Packet ();
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234),
Packet (123)), 0);
Simulator::Run ();
NS_TEST_ASSERT_EQUAL (m_receivedPacket.GetSize (), 123);
NS_TEST_ASSERT_EQUAL (m_receivedPacket2.GetSize (), 123);
return result;
}
static UdpSocketTest gUdpSocketTest;
}; // namespace ns3
#endif /* RUN_SELF_TESTS */

View File

@@ -762,7 +762,7 @@ SimulatorTests::cbaz5c (const int &, const int &, const int &, const int &, cons
bool
SimulatorTests::RunOneTest (void)
{
bool ok = true;
bool result = true;
m_a = true;
m_b = false;
m_c = true;
@@ -772,26 +772,16 @@ SimulatorTests::RunOneTest (void)
Simulator::Schedule (MicroSeconds (11), &SimulatorTests::B, this, 2);
m_idC = Simulator::Schedule (MicroSeconds (12), &SimulatorTests::C, this, 3);
if (m_idC.IsExpired ())
{
ok = false;
}
if (a.IsExpired ())
{
ok = false;
}
NS_TEST_ASSERT (!m_idC.IsExpired ());
NS_TEST_ASSERT (!a.IsExpired ());
Simulator::Cancel (a);
if (!a.IsExpired ())
{
ok = false;
}
NS_TEST_ASSERT (a.IsExpired ());
Simulator::Run ();
if (!m_a || !m_b || !m_c || !m_d)
{
ok = false;
}
return ok;
NS_TEST_ASSERT (m_a);
NS_TEST_ASSERT (m_b);
NS_TEST_ASSERT (m_c);
NS_TEST_ASSERT (m_d);
return result;
}
void
SimulatorTests::RunTestsConst (void) const
@@ -870,24 +860,25 @@ SimulatorTests::RunTestsConst (void) const
bool
SimulatorTests::RunTests (void)
{
bool ok = true;
bool result = true;
Simulator::Destroy ();
Simulator::SetLinkedList ();
if (!RunOneTest ())
{
ok = false;
result = false;
}
Simulator::Destroy ();
Simulator::SetBinaryHeap ();
if (!RunOneTest ())
{
ok = false;
result = false;
}
Simulator::Destroy ();
Simulator::SetStdMap ();
if (!RunOneTest ())
{
ok = false;
result = false;
}
Simulator::Destroy ();
@@ -1018,36 +1009,26 @@ SimulatorTests::RunTests (void)
EventId nowId = Simulator::ScheduleNow (&foo0);
m_destroyId = Simulator::ScheduleDestroy (&SimulatorTests::destroy, this);
if (m_destroyId.IsExpired ())
{
ok = false;
}
NS_TEST_ASSERT (!m_destroyId.IsExpired ());
Simulator::Run ();
m_destroy = false;
Simulator::Destroy ();
if (!m_destroy)
{
ok = false;
}
NS_TEST_ASSERT (m_destroy);
EventId anId = Simulator::ScheduleNow (&foo0);
EventId anotherId = anId;
if (anId.IsExpired () || anotherId.IsExpired ())
{
ok = false;
}
NS_TEST_ASSERT (!(anId.IsExpired () || anotherId.IsExpired ()));
Simulator::Remove (anId);
if (!anId.IsExpired () || !anotherId.IsExpired ())
{
ok = false;
}
NS_TEST_ASSERT (anId.IsExpired ());
NS_TEST_ASSERT (anotherId.IsExpired ());
Simulator::Run ();
Simulator::Destroy ();
return ok;
return result;
}
SimulatorTests gSimulatorTests;