merge with HEAD

This commit is contained in:
Mathieu Lacage
2008-04-17 15:50:49 -07:00
29 changed files with 201 additions and 143 deletions

View File

@@ -74,10 +74,8 @@ main (int argc, char *argv[])
NetDeviceContainer n0 = csma.Install (c0);
NetDeviceContainer n1 = csma.Install (c1);
InternetStackHelper internet;
internet.Install (c0);
internet.Install (c1);
internet.Install (c);
NS_LOG_INFO ("Assign IP Addresses.");
Ipv4AddressHelper ipv4;

View File

@@ -84,8 +84,7 @@ main (int argc, char *argv[])
NS_LOG_INFO ("Add IP Stack.");
InternetStackHelper internet;
internet.Install (c0);
internet.Install (c1);
internet.Install (c);
NS_LOG_INFO ("Assign IP Addresses.");
Ipv4AddressHelper ipv4Addr;

View File

@@ -111,12 +111,20 @@ PcapWriter::WriteData (uint8_t const*buffer, uint32_t size)
void
PcapWriter::Write32 (uint32_t data)
{
WriteData ((uint8_t*)&data, 4);
uint8_t buffer[4];
buffer[0] = (data >> 0) & 0xff;
buffer[1] = (data >> 8) & 0xff;
buffer[2] = (data >> 16) & 0xff;
buffer[3] = (data >> 24) & 0xff;
WriteData (buffer, 4);
}
void
PcapWriter::Write16 (uint16_t data)
{
WriteData((uint8_t*)&data, 2);
uint8_t buffer[2];
buffer[0] = (data >> 0) & 0xff;
buffer[1] = (data >> 8) & 0xff;
WriteData (buffer, 2);
}
} // namespace ns3

View File

@@ -42,7 +42,7 @@ CommandLine::Item::~Item ()
{}
void
CommandLine::Parse (int &iargc, char *argv[]) const
CommandLine::Parse (int iargc, char *argv[]) const
{
int argc = iargc;
for (argc--, argv++; argc > 0; argc--, argv++)

View File

@@ -64,7 +64,7 @@ public:
* Obviously, this method will parse the input command-line arguments and
* will attempt to handle them all.
*/
void Parse (int &argc, char *argv[]) const;
void Parse (int argc, char *argv[]) const;
private:
class Item
{

View File

@@ -191,7 +191,7 @@ Resolver::DoResolve (std::string path, Ptr<Object> root)
{
// This is a call to GetObject
std::string tidString = item.substr (1, item.size () - 1);
NS_LOG_DEBUG ("GetObject="<<tidString<<"on path="<<GetResolvedPath (""));
NS_LOG_DEBUG ("GetObject="<<tidString<<" on path="<<GetResolvedPath (""));
TypeId tid = TypeId::LookupByName (tidString);
Ptr<Object> object = root->GetObject<Object> (tid);
if (object == 0)

View File

@@ -140,6 +140,13 @@ Object::AggregateObject (Ptr<Object> o)
NS_ASSERT (!o->m_disposed);
NS_ASSERT (CheckLoose ());
NS_ASSERT (o->CheckLoose ());
if (DoGetObject (o->m_tid))
{
NS_FATAL_ERROR ("Object::AggregateObject(): "
"Multiple aggregation of objects of type " << o->m_tid.GetName ());
}
Object *other = PeekPointer (o);
Object *next = m_next;
m_next = other->m_next;

View File

@@ -137,6 +137,12 @@ private:
TracedCallback<T,T> m_cb;
};
template <typename T>
std::ostream& operator << (std::ostream& os, const TracedValue<T>& rhs)
{
return os<<rhs.Get();
}
template <typename T, typename U>
bool operator == (const TracedValue<T> &lhs, const TracedValue<U> &rhs)
{

View File

@@ -383,6 +383,7 @@ DcaTxop::NotifyAccessGranted (void)
m_currentPacket = 0;
m_dcf->ResetCw ();
m_dcf->StartBackoffNow (m_rng->GetNext (0, m_dcf->GetCw ()));
StartAccessIfNeeded ();
MY_DEBUG ("tx broadcast");
}
else

View File

@@ -108,6 +108,11 @@ ArpL3Protocol::Receive(Ptr<NetDevice> device, Ptr<Packet> packet, uint16_t proto
arp.GetDestinationIpv4Address () << "; we have address " <<
cache->GetInterface ()->GetAddress ());
/**
* Note: we do not update the ARP cache when we receive an ARP request
* from an unknown node. See bug #107
*/
if (arp.IsRequest () &&
arp.GetDestinationIpv4Address () == cache->GetInterface ()->GetAddress ())
{

View File

@@ -31,6 +31,7 @@
#include "tcp-typedefs.h"
#include "ns3/simulator.h"
#include "ns3/packet.h"
#include "ns3/trace-source-accessor.h"
#include <algorithm>
@@ -40,6 +41,20 @@ using namespace std;
namespace ns3 {
NS_OBJECT_ENSURE_REGISTERED (TcpSocket);
TypeId
TcpSocket::GetTypeId ()
{
static TypeId tid = TypeId("ns3::TcpSocket")
.SetParent<Socket> ()
.AddTraceSource ("CongestionWindow",
"The TCP connection's congestion window",
MakeTraceSourceAccessor (&TcpSocket::m_cWnd))
;
return tid;
}
TcpSocket::TcpSocket ()
: m_skipRetxResched (false),
m_dupAckCount (0),
@@ -680,6 +695,7 @@ bool TcpSocket::ProcessPacketAction (Actions_t a, Ptr<Packet> p,
// TCP SYN consumes one byte
m_nextRxSequence = tcpHeader.GetSequenceNumber() + SequenceNumber(1);
m_nextTxSequence = tcpHeader.GetAckNumber ();
m_firstPendingSequence = m_nextTxSequence; //bug 166
NS_LOG_DEBUG ("TcpSocket " << this << " ACK_TX_1" <<
" nextRxSeq " << m_nextRxSequence);
SendEmptyPacket (TcpHeader::ACK);
@@ -899,7 +915,7 @@ uint32_t TcpSocket::Window ()
{
NS_LOG_FUNCTION;
NS_LOG_LOGIC ("TcpSocket::Window() "<<this);
return std::min (m_rxWindowSize, m_cWnd);
return std::min (m_rxWindowSize, m_cWnd.Get());
}
uint32_t TcpSocket::AvailableWindow ()
@@ -1120,7 +1136,7 @@ void TcpSocket::NewAck (SequenceNumber seq)
}
else
{ // Congestion avoidance mode, adjust by (ackBytes*segSize) / cWnd
double adder = ((double) m_segmentSize * m_segmentSize) / m_cWnd;
double adder = ((double) m_segmentSize * m_segmentSize) / m_cWnd.Get();
if (adder < 1.0)
{
adder = 1.0;

View File

@@ -22,6 +22,7 @@
#include <stdint.h>
#include "ns3/callback.h"
#include "ns3/traced-value.h"
#include "ns3/socket.h"
#include "ns3/ptr.h"
#include "ns3/ipv4-address.h"
@@ -31,6 +32,7 @@
#include "sequence-number.h"
#include "rtt-estimator.h"
namespace ns3 {
class Ipv4EndPoint;
@@ -42,6 +44,7 @@ class TcpHeader;
class TcpSocket : public Socket
{
public:
static TypeId GetTypeId (void);
/**
* Create an unbound tcp socket.
*/
@@ -152,12 +155,12 @@ private:
SequenceNumber m_firstPendingSequence;
// Window management
uint32_t m_segmentSize; // SegmentSize
uint32_t m_rxWindowSize;
uint32_t m_advertisedWindowSize; // Window to advertise to peer
uint32_t m_cWnd; // Congestion window
uint32_t m_ssThresh; // Slow Start Threshold
uint32_t m_initialCWnd; // Initial (and reset) value for cWnd
uint32_t m_segmentSize; //SegmentSize
uint32_t m_rxWindowSize;
uint32_t m_advertisedWindowSize; //Window to advertise
TracedValue<uint32_t> m_cWnd; //Congestion window
uint32_t m_ssThresh; //Slow Start Threshold
uint32_t m_initialCWnd; //Initial cWnd value
// Round trip time estimation
Ptr<RttEstimator> m_rtt;

View File

@@ -300,14 +300,15 @@ UdpSocket::DoSendTo (Ptr<Packet> p, Ipv4Address dest, uint16_t port)
NotifyDataSent (p->GetSize ());
}
NS_LOG_LOGIC ("Limited broadcast end.");
return p->GetSize();
}
else if (ipv4->GetIfIndexForDestination(dest, localIfIndex))
{
NS_LOG_LOGIC ("Route exists");
m_udp->Send (p, ipv4->GetAddress (localIfIndex), dest,
m_udp->Send (p->Copy (), ipv4->GetAddress (localIfIndex), dest,
m_endPoint->GetLocalPort (), port);
NotifyDataSent (p->GetSize ());
return 0;
return p->GetSize();;
}
else
{
@@ -478,7 +479,7 @@ UdpSocketTest::RunTests (void)
m_receivedPacket = Create<Packet> ();
m_receivedPacket2 = Create<Packet> ();
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("10.0.0.1"), 1234),
Create<Packet> (123)), 0);
Create<Packet> (123)), 123);
Simulator::Run ();
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 0); // second interface should receive it
@@ -489,7 +490,7 @@ UdpSocketTest::RunTests (void)
m_receivedPacket = Create<Packet> ();
m_receivedPacket2 = Create<Packet> ();
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234),
Create<Packet> (123)), 0);
Create<Packet> (123)), 123);
Simulator::Run ();
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
// second socket should not receive it (it is bound specifically to the second interface's address
@@ -509,7 +510,7 @@ UdpSocketTest::RunTests (void)
m_receivedPacket = Create<Packet> ();
m_receivedPacket2 = Create<Packet> ();
NS_TEST_ASSERT_EQUAL (txSocket->SendTo (InetSocketAddress (Ipv4Address("255.255.255.255"), 1234),
Create<Packet> (123)), 0);
Create<Packet> (123)), 123);
Simulator::Run ();
NS_TEST_ASSERT_EQUAL (m_receivedPacket->GetSize (), 123);
NS_TEST_ASSERT_EQUAL (m_receivedPacket2->GetSize (), 123);

View File

@@ -111,9 +111,10 @@ ATTRIBUTE_HELPER_CPP (Address);
bool operator == (const Address &a, const Address &b)
{
NS_ASSERT (a.m_type == b.m_type ||
a.m_type == 0 ||
b.m_type == 0);
if (a.m_type != b.m_type)
{
return false;
}
NS_ASSERT (a.GetLength() == b.GetLength());
return memcmp (a.m_data, b.m_data, a.m_len) == 0;
}

View File

@@ -30,52 +30,52 @@ Tcp::GetTypeId (void)
{
static TypeId tid = TypeId ("ns3::Tcp")
.SetParent<SocketFactory> ()
.AddAttribute ("TcpDefaultSegmentSize",
"Default TCP maximum segment size in bytes (may be adjusted based on MTU discovery)",
UintegerValue (536),
MakeUintegerAccessor (&Tcp::m_defaultSegSize),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultAdvertisedWindowSize",
.AddAttribute ("DefaultSegmentSize",
"Default TCP maximum segment size in bytes (may be adjusted based on MTU discovery)",
UintegerValue (536),
MakeUintegerAccessor (&Tcp::m_defaultSegSize),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("DefaultAdvertisedWindowSize",
"Default TCP advertised window size (bytes)",
UintegerValue (0xffff),
MakeUintegerAccessor (&Tcp::m_defaultAdvWin),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultSlowStartThreshold",
.AddAttribute ("DefaultSlowStartThreshold",
"Default TCP slow start threshold (bytes)",
UintegerValue (0xffff),
MakeUintegerAccessor (&Tcp::m_defaultSsThresh),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultTxBufferSize",
.AddAttribute ("DefaultTxBufferSize",
"Default TCP maximum transmit buffer size (bytes)",
UintegerValue (0xffffffffl),
MakeUintegerAccessor (&Tcp::m_defaultTxBuffer),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultRxBufferSize",
.AddAttribute ("DefaultRxBufferSize",
"Default TCP maximum receive buffer size (bytes)",
UintegerValue (0xffffffffl),
MakeUintegerAccessor (&Tcp::m_defaultRxBuffer),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultInitialCongestionWindowSize",
.AddAttribute ("DefaultInitialCongestionWindowSize",
"Default TCP initial congestion window size (segments)",
UintegerValue (1),
MakeUintegerAccessor (&Tcp::m_defaultInitialCwnd),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultConnTimeout",
.AddAttribute ("DefaultConnTimeout",
"Default TCP retransmission timeout when opening connection (seconds)",
UintegerValue (3),
MakeUintegerAccessor (&Tcp::m_defaultConnTimeout),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultConnCount",
.AddAttribute ("DefaultConnCount",
"Default number of connection attempts (SYN retransmissions) before returning failure",
UintegerValue (6),
MakeUintegerAccessor (&Tcp::m_defaultConnCount),
MakeUintegerChecker<uint32_t> ())
.AddAttribute ("TcpDefaultDelAckTimeout",
.AddAttribute ("DefaultDelAckTimeout",
"Default timeout value for TCP delayed acks, in seconds",
DoubleValue (0.2),
MakeDoubleAccessor (&Tcp::m_defaultDelAckTimeout),
MakeDoubleChecker<double> ())
.AddAttribute ("TcpDefaultDelAckCount",
.AddAttribute ("DefaultDelAckCount",
"Default number of packets to wait before sending a TCP ack",
UintegerValue (2),
MakeUintegerAccessor (&Tcp::m_defaultDelAckCount),

View File

@@ -572,12 +572,15 @@ AgentImpl::MprComputation()
// (not in RFC but I think is needed: remove the 2-hop
// neighbors reachable by the MPR from N2)
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
twoHopNeigh != N2.end (); twoHopNeigh++)
twoHopNeigh != N2.end (); )
{
if (twoHopNeigh->neighborMainAddr == neighbor->neighborMainAddr)
{
twoHopNeigh = N2.erase (twoHopNeigh);
twoHopNeigh--;
}
else
{
twoHopNeigh++;
}
}
}
@@ -617,12 +620,15 @@ AgentImpl::MprComputation()
}
// Remove the nodes from N2 which are now covered by a node in the MPR set.
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
twoHopNeigh != N2.end (); twoHopNeigh++)
twoHopNeigh != N2.end (); )
{
if (coveredTwoHopNeighbors.find (twoHopNeigh->twoHopNeighborAddr) != coveredTwoHopNeighbors.end ())
{
twoHopNeigh = N2.erase (twoHopNeigh);
twoHopNeigh--;
}
else
{
twoHopNeigh++;
}
}
@@ -699,12 +705,15 @@ AgentImpl::MprComputation()
{
mprSet.insert (max->neighborMainAddr);
for (TwoHopNeighborSet::iterator twoHopNeigh = N2.begin ();
twoHopNeigh != N2.end (); twoHopNeigh++)
twoHopNeigh != N2.end (); )
{
if (twoHopNeigh->neighborMainAddr == max->neighborMainAddr)
{
twoHopNeigh = N2.erase (twoHopNeigh);
twoHopNeigh--;
}
else
{
twoHopNeigh++;
}
}
}

View File

@@ -64,12 +64,15 @@ void
OlsrState::EraseMprSelectorTuples (const Ipv4Address &mainAddr)
{
for (MprSelectorSet::iterator it = m_mprSelectorSet.begin ();
it != m_mprSelectorSet.end (); it++)
it != m_mprSelectorSet.end ();)
{
if (it->mainAddr == mainAddr)
{
it = m_mprSelectorSet.erase (it);
it--;
}
else
{
it++;
}
}
}
@@ -203,15 +206,18 @@ OlsrState::EraseTwoHopNeighborTuples (const Ipv4Address &neighborMainAddr,
const Ipv4Address &twoHopNeighborAddr)
{
for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
it != m_twoHopNeighborSet.end (); it++)
it != m_twoHopNeighborSet.end ();)
{
if (it->neighborMainAddr == neighborMainAddr
&& it->twoHopNeighborAddr == twoHopNeighborAddr)
{
it = m_twoHopNeighborSet.erase (it);
it--; // FIXME: is this correct in the case 'it' pointed to the first element?
m_modified = true;
}
else
{
it++;
}
}
}
@@ -219,13 +225,17 @@ void
OlsrState::EraseTwoHopNeighborTuples (const Ipv4Address &neighborMainAddr)
{
for (TwoHopNeighborSet::iterator it = m_twoHopNeighborSet.begin ();
it != m_twoHopNeighborSet.end (); it++)
it != m_twoHopNeighborSet.end ();)
{
if (it->neighborMainAddr == neighborMainAddr) {
it = m_twoHopNeighborSet.erase (it);
it--;
m_modified = true;
}
if (it->neighborMainAddr == neighborMainAddr)
{
it = m_twoHopNeighborSet.erase (it);
m_modified = true;
}
else
{
it++;
}
}
}
@@ -385,14 +395,17 @@ void
OlsrState::EraseOlderTopologyTuples (const Ipv4Address &lastAddr, uint16_t ansn)
{
for (TopologySet::iterator it = m_topologySet.begin();
it != m_topologySet.end(); it++)
it != m_topologySet.end();)
{
if (it->lastAddr == lastAddr && it->sequenceNumber < ansn)
{
it = m_topologySet.erase (it);
it--;
m_modified = true;
}
else
{
it++;
}
}
}

View File

@@ -31,7 +31,7 @@
* to move one if statement out of the loop.
*/
#include "scheduler-heap.h"
#include "heap-scheduler.h"
#include "event-impl.h"
#include "ns3/assert.h"
@@ -52,7 +52,7 @@ std::cout << "HEAP TRACE " << x << std::endl;
namespace ns3 {
SchedulerHeap::SchedulerHeap ()
HeapScheduler::HeapScheduler ()
{
// we purposedly waste an item at the start of
// the array to make sure the indexes in the
@@ -61,57 +61,57 @@ SchedulerHeap::SchedulerHeap ()
m_heap.push_back (std::make_pair (static_cast<EventImpl *>(0), emptyKey));
}
SchedulerHeap::~SchedulerHeap ()
HeapScheduler::~HeapScheduler ()
{}
uint32_t
SchedulerHeap::Parent (uint32_t id) const
HeapScheduler::Parent (uint32_t id) const
{
return id / 2;
}
uint32_t
SchedulerHeap::Sibling (uint32_t id) const
HeapScheduler::Sibling (uint32_t id) const
{
return id + 1;
}
uint32_t
SchedulerHeap::LeftChild (uint32_t id) const
HeapScheduler::LeftChild (uint32_t id) const
{
return id * 2;
}
uint32_t
SchedulerHeap::RightChild (uint32_t id) const
HeapScheduler::RightChild (uint32_t id) const
{
return id * 2 + 1;
}
uint32_t
SchedulerHeap::Root (void) const
HeapScheduler::Root (void) const
{
return 1;
}
bool
SchedulerHeap::IsRoot (uint32_t id) const
HeapScheduler::IsRoot (uint32_t id) const
{
return (id == Root ())?true:false;
}
uint32_t
SchedulerHeap::Last (void) const
HeapScheduler::Last (void) const
{
return m_heap.size () - 1;
}
bool
SchedulerHeap::IsBottom (uint32_t id) const
HeapScheduler::IsBottom (uint32_t id) const
{
return (id >= m_heap.size ())?true:false;
}
void
SchedulerHeap::Exch (uint32_t a, uint32_t b)
HeapScheduler::Exch (uint32_t a, uint32_t b)
{
NS_ASSERT (b < m_heap.size () && a < m_heap.size ());
TRACE ("Exch " << a << ", " << b);
@@ -121,7 +121,7 @@ SchedulerHeap::Exch (uint32_t a, uint32_t b)
}
bool
SchedulerHeap::IsLowerStrictly (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
HeapScheduler::IsLowerStrictly (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
{
if (a->m_ts < b->m_ts)
{
@@ -142,25 +142,25 @@ SchedulerHeap::IsLowerStrictly (Scheduler::EventKey const*a, Scheduler::EventKey
}
bool
SchedulerHeap::IsLessStrictly (uint32_t a, uint32_t b) const
HeapScheduler::IsLessStrictly (uint32_t a, uint32_t b) const
{
return IsLowerStrictly (&m_heap[a].second, &m_heap[b].second);
}
uint32_t
SchedulerHeap::Smallest (uint32_t a, uint32_t b) const
HeapScheduler::Smallest (uint32_t a, uint32_t b) const
{
return IsLessStrictly (a,b)?a:b;
}
bool
SchedulerHeap::IsEmpty (void) const
HeapScheduler::IsEmpty (void) const
{
return (m_heap.size () == 1)?true:false;
}
void
SchedulerHeap::BottomUp (void)
HeapScheduler::BottomUp (void)
{
uint32_t index = Last ();
while (!IsRoot (index) &&
@@ -172,7 +172,7 @@ SchedulerHeap::BottomUp (void)
}
void
SchedulerHeap::TopDown (uint32_t start)
HeapScheduler::TopDown (uint32_t start)
{
uint32_t index = start;
uint32_t right = RightChild (index);
@@ -207,7 +207,7 @@ SchedulerHeap::TopDown (uint32_t start)
void
SchedulerHeap::Insert (const EventId &id)
HeapScheduler::Insert (const EventId &id)
{
// acquire single ref
EventImpl *event = id.PeekEventImpl ();
@@ -220,13 +220,13 @@ SchedulerHeap::Insert (const EventId &id)
}
EventId
SchedulerHeap::PeekNext (void) const
HeapScheduler::PeekNext (void) const
{
std::pair<EventImpl *,Scheduler::EventKey> next = m_heap[Root ()];
return EventId (next.first, next.second.m_ts, next.second.m_uid);
}
EventId
SchedulerHeap::RemoveNext (void)
HeapScheduler::RemoveNext (void)
{
std::pair<EventImpl *,Scheduler::EventKey> next = m_heap[Root ()];
Exch (Root (), Last ());
@@ -237,7 +237,7 @@ SchedulerHeap::RemoveNext (void)
bool
SchedulerHeap::Remove (const EventId &id)
HeapScheduler::Remove (const EventId &id)
{
uint32_t uid = id.GetUid ();
for (uint32_t i = 1; i < m_heap.size (); i++)

View File

@@ -29,10 +29,10 @@ namespace ns3 {
class EventHolder;
class SchedulerHeap : public Scheduler {
class HeapScheduler : public Scheduler {
public:
SchedulerHeap ();
virtual ~SchedulerHeap ();
HeapScheduler ();
virtual ~HeapScheduler ();
virtual void Insert (const EventId &id);
virtual bool IsEmpty (void) const;

View File

@@ -18,7 +18,7 @@
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "scheduler-list.h"
#include "list-scheduler.h"
#include "event-impl.h"
#include <utility>
#include <string>
@@ -27,13 +27,13 @@
namespace ns3 {
SchedulerList::SchedulerList ()
ListScheduler::ListScheduler ()
{}
SchedulerList::~SchedulerList ()
ListScheduler::~ListScheduler ()
{}
bool
SchedulerList::IsLower (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
ListScheduler::IsLower (Scheduler::EventKey const*a, Scheduler::EventKey const*b) const
{
if (a->m_ts < b->m_ts)
{
@@ -51,7 +51,7 @@ SchedulerList::IsLower (Scheduler::EventKey const*a, Scheduler::EventKey const*b
}
void
SchedulerList::Insert (const EventId &id)
ListScheduler::Insert (const EventId &id)
{
Scheduler::EventKey key;
// acquire refcount on EventImpl
@@ -70,19 +70,19 @@ SchedulerList::Insert (const EventId &id)
m_events.push_back (std::make_pair (event, key));
}
bool
SchedulerList::IsEmpty (void) const
ListScheduler::IsEmpty (void) const
{
return m_events.empty ();
}
EventId
SchedulerList::PeekNext (void) const
ListScheduler::PeekNext (void) const
{
std::pair<EventImpl *, EventKey> next = m_events.front ();
return EventId (next.first, next.second.m_ts, next.second.m_uid);
}
EventId
SchedulerList::RemoveNext (void)
ListScheduler::RemoveNext (void)
{
std::pair<EventImpl *, EventKey> next = m_events.front ();
m_events.pop_front ();
@@ -90,7 +90,7 @@ SchedulerList::RemoveNext (void)
}
bool
SchedulerList::Remove (const EventId &id)
ListScheduler::Remove (const EventId &id)
{
for (EventsI i = m_events.begin (); i != m_events.end (); i++)
{

View File

@@ -31,10 +31,10 @@ namespace ns3 {
class EventImpl;
class SchedulerList : public Scheduler {
class ListScheduler : public Scheduler {
public:
SchedulerList ();
virtual ~SchedulerList ();
ListScheduler ();
virtual ~ListScheduler ();
virtual void Insert (const EventId &id);
virtual bool IsEmpty (void) const;

View File

@@ -19,7 +19,7 @@
* The idea to use a std c++ map came from GTNetS
*/
#include "scheduler-map.h"
#include "map-scheduler.h"
#include "event-impl.h"
#include "ns3/assert.h"
#include <string>
@@ -37,9 +37,9 @@ std::cout << "MAP TRACE " << x << std::endl;
namespace ns3 {
SchedulerMap::SchedulerMap ()
MapScheduler::MapScheduler ()
{}
SchedulerMap::~SchedulerMap ()
MapScheduler::~MapScheduler ()
{}
/* Note the invariants which this function must provide:
@@ -48,7 +48,7 @@ SchedulerMap::~SchedulerMap ()
* - transitivity: f(x,y) and f(y,z) => f(x,z)
*/
bool
SchedulerMap::EventKeyCompare::operator () (struct EventKey const&a, struct EventKey const&b)
MapScheduler::EventKeyCompare::operator () (struct EventKey const&a, struct EventKey const&b)
{
if (a.m_ts < b.m_ts)
{
@@ -71,7 +71,7 @@ SchedulerMap::EventKeyCompare::operator () (struct EventKey const&a, struct Even
void
SchedulerMap::Insert (const EventId &id)
MapScheduler::Insert (const EventId &id)
{
// acquire a single ref
EventImpl *event = id.PeekEventImpl ();
@@ -85,13 +85,13 @@ SchedulerMap::Insert (const EventId &id)
}
bool
SchedulerMap::IsEmpty (void) const
MapScheduler::IsEmpty (void) const
{
return m_list.empty ();
}
EventId
SchedulerMap::PeekNext (void) const
MapScheduler::PeekNext (void) const
{
EventMapCI i = m_list.begin ();
NS_ASSERT (i != m_list.end ());
@@ -99,7 +99,7 @@ SchedulerMap::PeekNext (void) const
return EventId (i->second, i->first.m_ts, i->first.m_uid);
}
EventId
SchedulerMap::RemoveNext (void)
MapScheduler::RemoveNext (void)
{
EventMapI i = m_list.begin ();
std::pair<Scheduler::EventKey, EventImpl*> next = *i;
@@ -108,7 +108,7 @@ SchedulerMap::RemoveNext (void)
}
bool
SchedulerMap::Remove (const EventId &id)
MapScheduler::Remove (const EventId &id)
{
Scheduler::EventKey key;
key.m_ts = id.GetTs ();

View File

@@ -30,10 +30,10 @@ namespace ns3 {
class EventImpl;
class SchedulerMap : public Scheduler {
class MapScheduler : public Scheduler {
public:
SchedulerMap ();
virtual ~SchedulerMap ();
MapScheduler ();
virtual ~MapScheduler ();
virtual void Insert (const EventId &id);
virtual bool IsEmpty (void) const;
@@ -47,9 +47,9 @@ private:
bool operator () (struct EventKey const&a, struct EventKey const&b);
};
typedef std::map<Scheduler::EventKey, EventImpl*, SchedulerMap::EventKeyCompare> EventMap;
typedef std::map<Scheduler::EventKey, EventImpl*, SchedulerMap::EventKeyCompare>::iterator EventMapI;
typedef std::map<Scheduler::EventKey, EventImpl*, SchedulerMap::EventKeyCompare>::const_iterator EventMapCI;
typedef std::map<Scheduler::EventKey, EventImpl*, MapScheduler::EventKeyCompare> EventMap;
typedef std::map<Scheduler::EventKey, EventImpl*, MapScheduler::EventKeyCompare>::iterator EventMapI;
typedef std::map<Scheduler::EventKey, EventImpl*, MapScheduler::EventKeyCompare>::const_iterator EventMapCI;
EventMap m_list;

View File

@@ -274,6 +274,7 @@ TimeUnit<N1+N2> operator * (TimeUnit<N1> const &lhs, TimeUnit<N2> const &rhs)
template <int N1, int N2>
TimeUnit<N1-N2> operator / (TimeUnit<N1> const &lhs, TimeUnit<N2> const &rhs)
{
NS_ASSERT (rhs.GetHighPrecision ().GetDouble () != 0);
HighPrecision retval = lhs.GetHighPrecision ();
retval.Div (rhs.GetHighPrecision ());
return TimeUnit<N1-N2> (retval);

View File

@@ -399,9 +399,7 @@ SimulatorPrivate::GetMaximumSimulationTime (void) const
}; // namespace ns3
#include "scheduler-list.h"
#include "scheduler-heap.h"
#include "scheduler-map.h"
#include "map-scheduler.h"
namespace ns3 {
@@ -424,7 +422,7 @@ Simulator::GetPriv (void)
if (m_priv == 0)
{
m_priv = CreateObject<SimulatorPrivate> ();
Ptr<Scheduler> scheduler = CreateObject<SchedulerMap> ();
Ptr<Scheduler> scheduler = CreateObject<MapScheduler> ();
m_priv->SetScheduler (scheduler);
}
TRACE_S ("priv " << m_priv);
@@ -570,6 +568,8 @@ Simulator::GetMaximumSimulationTime (void)
#include "ns3/test.h"
#include "ns3/ptr.h"
#include "list-scheduler.h"
#include "heap-scheduler.h"
namespace ns3 {
@@ -940,19 +940,19 @@ SimulatorTests::RunTests (void)
bool result = true;
Simulator::Destroy ();
Simulator::SetScheduler (CreateObject<SchedulerList> ());
Simulator::SetScheduler (CreateObject<ListScheduler> ());
if (!RunOneTest ())
{
result = false;
}
Simulator::Destroy ();
Simulator::SetScheduler (CreateObject<SchedulerHeap> ());
Simulator::SetScheduler (CreateObject<HeapScheduler> ());
if (!RunOneTest ())
{
result = false;
}
Simulator::Destroy ();
Simulator::SetScheduler (CreateObject<SchedulerMap> ());
Simulator::SetScheduler (CreateObject<MapScheduler> ());
if (!RunOneTest ())
{
result = false;

View File

@@ -53,9 +53,9 @@ def build(bld):
'time.cc',
'event-id.cc',
'scheduler.cc',
'scheduler-list.cc',
'scheduler-heap.cc',
'scheduler-map.cc',
'list-scheduler.cc',
'map-scheduler.cc',
'heap-scheduler.cc',
'event-impl.cc',
'simulator.cc',
'timer.cc',
@@ -71,9 +71,9 @@ def build(bld):
'event-impl.h',
'simulator.h',
'scheduler.h',
'scheduler-list.h',
'scheduler-map.h',
'scheduler-heap.h',
'list-scheduler.h',
'map-scheduler.h',
'heap-scheduler.h',
'simulation-singleton.h',
'timer.h',
'timer-impl.h',

View File

@@ -18,11 +18,8 @@
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "ns3/simulator.h"
#include "ns3/scheduler-list.h"
#include "ns3/scheduler-map.h"
#include "ns3/scheduler-heap.h"
#include "ns3/system-wall-clock-ms.h"
#include "ns3/simulator-module.h"
#include "ns3/core-module.h"
#include <iostream>
#include <fstream>
#include <vector>
@@ -161,15 +158,15 @@ int main (int argc, char *argv[])
{
if (strcmp ("--list", argv[0]) == 0)
{
Simulator::SetScheduler (CreateObject<SchedulerList> ());
Simulator::SetScheduler (CreateObject<ListScheduler> ());
}
else if (strcmp ("--heap", argv[0]) == 0)
{
Simulator::SetScheduler (CreateObject<SchedulerHeap> ());
Simulator::SetScheduler (CreateObject<HeapScheduler> ());
}
else if (strcmp ("--map", argv[0]) == 0)
{
Simulator::SetScheduler (CreateObject<SchedulerMap> ());
Simulator::SetScheduler (CreateObject<MapScheduler> ());
}
else if (strcmp ("--debug", argv[0]) == 0)
{

View File

@@ -18,12 +18,8 @@
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "ns3/simulator.h"
#include "ns3/scheduler-list.h"
#include "ns3/scheduler-map.h"
#include "ns3/scheduler-heap.h"
#include "ns3/nstime.h"
#include "ns3/system-wall-clock-ms.h"
#include "ns3/simulator-module.h"
#include "ns3/core-module.h"
#include <vector>
#include <deque>
#include <fstream>
@@ -317,15 +313,15 @@ int main (int argc, char *argv[])
{
if (is_map)
{
Simulator::SetScheduler (CreateObject<SchedulerMap> ());
Simulator::SetScheduler (CreateObject<MapScheduler> ());
}
else if (is_list)
{
Simulator::SetScheduler (CreateObject<SchedulerList> ());
Simulator::SetScheduler (CreateObject<ListScheduler> ());
}
else if (is_heap)
{
Simulator::SetScheduler (CreateObject<SchedulerHeap> ());
Simulator::SetScheduler (CreateObject<HeapScheduler> ());
}
log.Run ();
Simulator::Destroy ();

View File

@@ -340,9 +340,6 @@ def shutdown():
run_program(Params.g_options.run, get_command_template())
raise SystemExit(0)
if Params.g_options.command_template:
Params.fatal("Option --command-template requires the option --run to be given")
def _run_waf_check():
## generate the trace sources list docs
env = Params.g_build.env_of_name('default')