merge new RLC tests with ns-3-lena-dev

This commit is contained in:
Manuel Requena
2012-01-31 11:19:57 +01:00
19 changed files with 206 additions and 74 deletions

View File

@@ -43,6 +43,16 @@ the cracks, unfortunately. If you, as a user, can suggest improvements
to this file based on your experience, please contribute a patch or drop
us a note on ns-developers mailing list. </p>
<hr>
<h1>Changes from ns-3.13 to ns-3-dev</h1>
<h2>Changes to existing API:</h2>
<ul>
<li> The Ipv6RawSocketImpl "IcmpFilter" attribute has been removed. Six
new member functions have been added to enable the same functionality.
</li>
</ul>
<hr>
<h1>Changes from ns-3.12 to ns-3.13</h1>

View File

@@ -9,6 +9,29 @@ http://www.nsnam.org including tutorials: http://www.nsnam.org/tutorials.html
Consult the file CHANGES.html for more detailed information about changed
API and behavior across ns-3 releases.
Release 3-dev
==============
Availability
------------
This release is available from:
Supported platforms
-------------------
New user-visible features
-------------------------
Bugs fixed
----------
- bug 1319 - Fix Ipv6RawSocketImpl Icmpv6 filter
- bug 1318 - Asserts for IPv6 malformed packets
Known issues
------------
In general, known issues are tracked on the project tracker available
at http://www.nsnam.org/bugzilla/
Release 3.13
==============

View File

@@ -114,6 +114,7 @@ Ipv4ClickRouting::SetIpv4 (Ptr<Ipv4> ipv4)
void
Ipv4ClickRouting::DoDispose ()
{
simclick_click_kill (m_simNode);
m_ipv4 = 0;
delete m_simNode;
Ipv4RoutingProtocol::DoDispose ();
@@ -416,8 +417,15 @@ Ipv4ClickRouting::Receive (Ptr<Packet> p, Mac48Address receiverAddr, Mac48Addres
std::string
Ipv4ClickRouting::ReadHandler (std::string elementName, std::string handlerName)
{
std::string s = simclick_click_read_handler (m_simNode, elementName.c_str (), handlerName.c_str (), 0, 0);
return s;
char *handle = simclick_click_read_handler (m_simNode, elementName.c_str (), handlerName.c_str (), 0, 0);
std::string ret (handle);
// This is required because Click does not free
// the memory allocated to the return string
// from simclick_click_read_handler()
free(handle);
return ret;
}
int

View File

@@ -476,8 +476,8 @@ EmuNetDevice::CreateSocket (void)
//
// Execute the socket creation process image.
//
status = ::execlp ("emu-sock-creator",
"emu-sock-creator", // argv[0] (filename)
status = ::execlp (EMU_SOCK_CREATOR,
EMU_SOCK_CREATOR, // argv[0] (filename)
oss.str ().c_str (), // argv[1] (-p<path?
(char *)NULL);

View File

@@ -43,12 +43,14 @@ def build(bld):
'helper/emu-helper.h',
]
obj = bld.create_suid_program('emu-sock-creator')
obj.source = [
creator = bld.create_suid_program('emu-sock-creator')
creator.source = [
'model/emu-sock-creator.cc',
'model/emu-encode-decode.cc',
]
module.env.append_value("DEFINES", "EMU_SOCK_CREATOR=\"%s\"" % (creator.target,))
if bld.env['ENABLE_EXAMPLES']:
bld.add_subdirs('examples')

View File

@@ -127,6 +127,16 @@ paired with an IPv4 representation of such device. In Linux, this class
main purpose is to provide address-family specific information (addresses) about
an interface.
All the classes have appropriate traces in order to track sent, received and lost packets.
The users is encouraged to use them so to find out if (and where) a packet is dropped. A
common mistake is to forget the effects of local queues when sending packets, e.g., the ARP
queue. This can be particularly puzzling when sending jumbo packets or packet bursts using UDP.
The ARP cache pending queue is limited (3 datagrams) and IP packets might be fragmented, easily
overfilling the ARP cache queue size. In those cases it is useful to increase the ARP cache
pending size to a proper value, e.g.:::
Config::SetDefault ("ns3::ArpCache::PendingQueueSize", UintegerValue (MAX_BURST_SIZE/L2MTU*3));
The IPv6 implementation follows a similar architecture.
Layer-4 protocols and sockets

View File

@@ -29,7 +29,7 @@ Ipv4RawSocketImpl::GetTypeId (void)
MakeUintegerAccessor (&Ipv4RawSocketImpl::m_protocol),
MakeUintegerChecker<uint16_t> ())
.AddAttribute ("IcmpFilter",
"Any icmp header whose type field matches a bit in this filter is dropped.",
"Any icmp header whose type field matches a bit in this filter is dropped. Type must be less than 32.",
UintegerValue (0),
MakeUintegerAccessor (&Ipv4RawSocketImpl::m_icmpFilter),
MakeUintegerChecker<uint32_t> ())
@@ -326,7 +326,7 @@ Ipv4RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<Ipv4
copy->PeekHeader (icmpHeader);
uint8_t type = icmpHeader.GetType ();
if (type < 32 &&
((1 << type) & m_icmpFilter))
((uint32_t(1) << type) & m_icmpFilter))
{
// filter out icmp packet.
return false;

View File

@@ -51,10 +51,6 @@ TypeId Ipv6RawSocketImpl::GetTypeId ()
UintegerValue (0),
MakeUintegerAccessor (&Ipv6RawSocketImpl::m_protocol),
MakeUintegerChecker<uint16_t> ())
.AddAttribute ("IcmpFilter", "Any ICMPv6 header whose type field matches a bit in this filter is dropped.",
UintegerValue (0),
MakeUintegerAccessor (&Ipv6RawSocketImpl::m_icmpFilter),
MakeUintegerChecker<uint32_t> ())
;
return tid;
}
@@ -69,6 +65,7 @@ Ipv6RawSocketImpl::Ipv6RawSocketImpl ()
m_protocol = 0;
m_shutdownSend = false;
m_shutdownRecv = false;
Icmpv6FilterSetPassAll();
}
Ipv6RawSocketImpl::~Ipv6RawSocketImpl ()
@@ -328,7 +325,7 @@ bool Ipv6RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv6Header hdr, Ptr<NetD
copy->PeekHeader (icmpHeader);
uint8_t type = icmpHeader.GetType ();
if ((1 << type) & m_icmpFilter)
if (Icmpv6FilterWillBlock(type))
{
/* packet filtered */
return false;
@@ -372,5 +369,41 @@ Ipv6RawSocketImpl::GetAllowBroadcast () const
return true;
}
void
Ipv6RawSocketImpl::Icmpv6FilterSetPassAll()
{
memset(&m_icmpFilter, 0xff, sizeof(icmpv6Filter));
}
void
Ipv6RawSocketImpl::Icmpv6FilterSetBlockAll()
{
memset(&m_icmpFilter, 0x00, sizeof(icmpv6Filter));
}
void
Ipv6RawSocketImpl::Icmpv6FilterSetPass(uint8_t type)
{
(m_icmpFilter.icmpv6Filt[(type) >> 5]) |= (uint32_t(1) << ((type) & 31));
}
void
Ipv6RawSocketImpl::Icmpv6FilterSetBlock(uint8_t type)
{
(m_icmpFilter.icmpv6Filt[(type) >> 5]) &= ~(uint32_t(1) << ((type) & 31));
}
bool
Ipv6RawSocketImpl::Icmpv6FilterWillPass(uint8_t type)
{
return (((m_icmpFilter.icmpv6Filt[(type) >> 5]) & (uint32_t(1) << ((type) & 31))) != 0);
}
bool
Ipv6RawSocketImpl::Icmpv6FilterWillBlock(uint8_t type)
{
return (((m_icmpFilter.icmpv6Filt[(type) >> 5]) & (uint32_t(1) << ((type) & 31))) == 0);
}
} /* namespace ns3 */

View File

@@ -219,10 +219,47 @@ public:
virtual bool SetAllowBroadcast (bool allowBroadcast);
virtual bool GetAllowBroadcast () const;
/**
* \brief Clean the ICMPv6 filter structure
*/
void Icmpv6FilterSetPassAll();
/**
* \brief Set the filter to block all the ICMPv6 types
*/
void Icmpv6FilterSetBlockAll();
/**
* \brief Set the filter to pass one ICMPv6 type
* \param the ICMPv6 type to pass
*/
void Icmpv6FilterSetPass(uint8_t type);
/**
* \brief Set the filter to block one ICMPv6 type
* \param the ICMPv6 type to block
*/
void Icmpv6FilterSetBlock(uint8_t type);
/**
* \brief Ask the filter about the status of one ICMPv6 type
* \param the ICMPv6 type
* \return true if the ICMP type is passing through
*/
bool Icmpv6FilterWillPass(uint8_t type);
/**
* \brief Ask the filter about the status of one ICMPv6 type
* \param the ICMPv6 type
* \return true if the ICMP type is being blocked
*/
bool Icmpv6FilterWillBlock(uint8_t type);
private:
/**
* \struct Data
* \brief IPv6 raw data and additionnal information.
* \brief IPv6 raw data and additional information.
*/
struct Data
{
@@ -276,10 +313,18 @@ private:
*/
bool m_shutdownRecv;
/**
* \brief Struct to hold the ICMPv6 filter
*/
typedef struct
{
uint32_t icmpv6Filt[8];
} icmpv6Filter;
/**
* \brief ICMPv6 filter.
*/
uint32_t m_icmpFilter;
icmpv6Filter m_icmpFilter;
};
} /* namespace ns3 */

View File

@@ -108,7 +108,7 @@ main (int argc, char *argv[])
Vector v (roomLength * (column + 0.5), roomLength * (row + 0.5), nodeHeight);
positionAlloc->Add (v);
enbPosition.push_back (v);
mobility.Install (ueNodes[plantedEnb]);
mobility.Install (ueNodes.at(plantedEnb));
}
}
mobility.SetPositionAllocator (positionAlloc);
@@ -117,17 +117,17 @@ main (int argc, char *argv[])
// Position of UEs attached to eNB
for (uint32_t i = 0; i < nEnb; i++)
{
UniformVariable posX (enbPosition[i].x - roomLength * 0.5,
enbPosition[i].x + roomLength * 0.5);
UniformVariable posY (enbPosition[i].y - roomLength * 0.5,
enbPosition[i].y + roomLength * 0.5);
UniformVariable posX (enbPosition.at(i).x - roomLength * 0.5,
enbPosition.at(i).x + roomLength * 0.5);
UniformVariable posY (enbPosition.at(i).y - roomLength * 0.5,
enbPosition.at(i).y + roomLength * 0.5);
positionAlloc = CreateObject<ListPositionAllocator> ();
for (uint32_t j = 0; j < nUe; j++)
{
positionAlloc->Add (Vector (posX.GetValue (), posY.GetValue (), nodeHeight));
mobility.SetPositionAllocator (positionAlloc);
}
mobility.Install (ueNodes[i]);
mobility.Install (ueNodes.at(i));
}
}
@@ -164,10 +164,10 @@ main (int argc, char *argv[])
mmEnb->SetRoomNumberY (column);
// Positioning UEs attached to eNB
mobility.Install (ueNodes[plantedEnb]);
mobility.Install (ueNodes.at(plantedEnb));
for (uint32_t ue = 0; ue < nUe; ue++)
{
Ptr<BuildingsMobilityModel> mmUe = ueNodes[plantedEnb].Get (ue)->GetObject<BuildingsMobilityModel> ();
Ptr<BuildingsMobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<BuildingsMobilityModel> ();
Vector vUe (v.x, v.y, v.z);
mmUe->SetPosition (vUe);
mmUe->SetIndoor (building);
@@ -191,7 +191,7 @@ main (int argc, char *argv[])
enbDevs = lteHelper->InstallEnbDevice (enbNodes);
for (uint32_t i = 0; i < nEnb; i++)
{
NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes[i]);
NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i));
ueDevs.push_back (ueDev);
lteHelper->Attach (ueDev, enbDevs.Get (i));
enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;

View File

@@ -47,8 +47,6 @@ main (int argc, char *argv[])
cmd.Parse (argc, argv);
Config::SetDefault ("ns3::LteSpectrumPhy::PemEnabled", BooleanValue (false));
// Geometry of the scenario (in meters)
// Assume squared building
double nodeHeight = 1.5;
@@ -61,7 +59,7 @@ main (int argc, char *argv[])
Ptr < LteHelper > lteHelper = CreateObject<LteHelper> ();
//lteHelper->EnableLogComponents ();
lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::BuildingsPropagationLossModel"));
lteHelper->SetAttribute ("PathlossModel", StringValue ("ns3::FriisPropagationLossModel"));
// Create Nodes: eNodeB and UE
NodeContainer enbNodes;
@@ -114,10 +112,10 @@ main (int argc, char *argv[])
mmEnb->SetRoomNumberY (column);
// Positioning UEs attached to eNB
mobility.Install (ueNodes.at (plantedEnb));
mobility.Install (ueNodes.at(plantedEnb));
for (uint32_t ue = 0; ue < nUe; ue++)
{
Ptr<BuildingsMobilityModel> mmUe = ueNodes.at (plantedEnb).Get (ue)->GetObject<BuildingsMobilityModel> ();
Ptr<BuildingsMobilityModel> mmUe = ueNodes.at(plantedEnb).Get (ue)->GetObject<BuildingsMobilityModel> ();
Vector vUe (v.x, v.y, v.z);
mmUe->SetPosition (vUe);
mmUe->SetIndoor (building);
@@ -132,7 +130,7 @@ main (int argc, char *argv[])
Vector v (500, 3000, nodeHeight);
positionAlloc->Add (v);
enbPosition.push_back (v);
mobility.Install (ueNodes.at (plantedEnb));
mobility.Install (ueNodes.at(plantedEnb));
plantedEnb++;
// Add the 3-sector site
@@ -141,7 +139,7 @@ main (int argc, char *argv[])
Vector v (500, 2000, nodeHeight);
positionAlloc->Add (v);
enbPosition.push_back (v);
mobility.Install (ueNodes.at (plantedEnb));
mobility.Install (ueNodes.at(plantedEnb));
}
@@ -151,24 +149,24 @@ main (int argc, char *argv[])
// Position of UEs attached to eNB
for (uint32_t i = 0; i < nEnb; i++)
{
UniformVariable posX (enbPosition.at (i).x - roomLength * 0,
enbPosition.at (i).x + roomLength * 0);
UniformVariable posY (enbPosition.at (i).y - roomLength * 0,
enbPosition.at (i).y + roomLength * 0);
UniformVariable posX (enbPosition.at(i).x - roomLength * 0,
enbPosition.at(i).x + roomLength * 0);
UniformVariable posY (enbPosition.at(i).y - roomLength * 0,
enbPosition.at(i).y + roomLength * 0);
positionAlloc = CreateObject<ListPositionAllocator> ();
for (uint32_t j = 0; j < nUe; j++)
{
if ( i == nEnb - 3 )
{
positionAlloc->Add (Vector (enbPosition.at (i).x + 10, enbPosition.at (i).y, nodeHeight));
positionAlloc->Add (Vector (enbPosition.at(i).x + 10, enbPosition.at(i).y, nodeHeight));
}
else if ( i == nEnb - 2 )
{
positionAlloc->Add (Vector (enbPosition.at (i).x - sqrt (10), enbPosition.at (i).y + sqrt (10), nodeHeight));
positionAlloc->Add (Vector (enbPosition.at(i).x - sqrt (10), enbPosition.at(i).y + sqrt (10), nodeHeight));
}
else if ( i == nEnb - 1 )
{
positionAlloc->Add (Vector (enbPosition.at (i).x - sqrt (10), enbPosition.at (i).y - sqrt (10), nodeHeight));
positionAlloc->Add (Vector (enbPosition.at(i).x - sqrt (10), enbPosition.at(i).y - sqrt (10), nodeHeight));
}
else
{
@@ -176,7 +174,7 @@ main (int argc, char *argv[])
}
mobility.SetPositionAllocator (positionAlloc);
}
mobility.Install (ueNodes.at (i));
mobility.Install (ueNodes.at(i));
}
BuildingsHelper::MakeMobilityModelConsistent ();
@@ -208,7 +206,7 @@ main (int argc, char *argv[])
for (uint32_t i = 0; i < nEnb; i++)
{
NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at (i));
NetDeviceContainer ueDev = lteHelper->InstallUeDevice (ueNodes.at(i));
ueDevs.push_back (ueDev);
lteHelper->Attach (ueDev, enbDevs.Get (i));
enum EpsBearer::Qci q = EpsBearer::GBR_CONV_VOICE;
@@ -217,19 +215,17 @@ main (int argc, char *argv[])
}
Simulator::Stop (Seconds (simTime));
// better to leave traces disabled
//lteHelper->EnableTraces ();
lteHelper->EnableTraces ();
Ptr<RadioEnvironmentMapHelper> remHelper = CreateObject<RadioEnvironmentMapHelper> ();
remHelper->SetAttribute ("ChannelPath", StringValue ("/ChannelList/0"));
remHelper->SetAttribute ("OutputFile", StringValue ("rem.out"));
remHelper->SetAttribute ("XMin", DoubleValue (-200.0));
remHelper->SetAttribute ("XMax", DoubleValue (1200.0));
remHelper->SetAttribute ("XRes", UintegerValue (300));
remHelper->SetAttribute ("YMin", DoubleValue (-300.0));
remHelper->SetAttribute ("XMin", DoubleValue (-2000.0));
remHelper->SetAttribute ("XMax", DoubleValue (+2000.0));
remHelper->SetAttribute ("XRes", UintegerValue (100));
remHelper->SetAttribute ("YMin", DoubleValue (-500.0));
remHelper->SetAttribute ("YMax", DoubleValue (+3500.0));
remHelper->SetAttribute ("YRes", UintegerValue (300));
remHelper->SetAttribute ("YRes", UintegerValue (100));
remHelper->SetAttribute ("Z", DoubleValue (1.5));
remHelper->Install ();
// Recall the buildings helper to place the REM nodes in its position

View File

@@ -238,7 +238,7 @@ LteAmc::GetCqiFromSpectralEfficiency (double s)
{
++cqi;
}
NS_LOG_FUNCTION (s << cqi);
NS_LOG_LOGIC ("cqi = " << cqi);
return cqi;
}
@@ -254,7 +254,7 @@ LteAmc::GetMcsFromCqi (int cqi)
{
++mcs;
}
NS_LOG_FUNCTION (cqi << mcs);
NS_LOG_LOGIC ("mcs = " << mcs);
return mcs;
}
@@ -274,8 +274,9 @@ LteAmc::GetTbSizeFromMcs (int mcs, int nprb)
double
LteAmc::GetSpectralEfficiencyFromCqi (int cqi)
{
NS_LOG_FUNCTION (cqi);
NS_ASSERT_MSG (cqi >= 0 && cqi <= 15, "CQI must be in [0..15] = " << cqi);
NS_LOG_FUNCTION (cqi << SpectralEfficiencyForCqi[cqi]);
NS_LOG_LOGIC ("Spectral efficiency = " << SpectralEfficiencyForCqi[cqi]);
return SpectralEfficiencyForCqi[cqi];
}
@@ -283,7 +284,7 @@ LteAmc::GetSpectralEfficiencyFromCqi (int cqi)
std::vector<int>
LteAmc::CreateCqiFeedbacks (const SpectrumValue& sinr)
{
NS_LOG_FUNCTION_NOARGS ();
NS_LOG_FUNCTION (this);
std::vector<int> cqi;
Values::const_iterator it;

View File

@@ -480,7 +480,7 @@ LteEnbMac::DoReceiveIdealControlMessage (Ptr<IdealControlMessage> msg)
}
else
{
NS_LOG_FUNCTION (this << " IdealControlMessage not recognized");
NS_LOG_LOGIC (this << " IdealControlMessage not recognized");
}
}
@@ -501,10 +501,9 @@ void
LteEnbMac::ReceiveDlCqiIdealControlMessage (Ptr<DlCqiIdealControlMessage> msg)
{
NS_LOG_FUNCTION (this << msg);
// NS_LOG_FUNCTION (this << msg->GetSourceDevice () << msg->GetDestinationDevice ());
CqiListElement_s dlcqi = msg->GetDlCqi ();
NS_LOG_FUNCTION (this << "Enb Received DL-CQI rnti" << dlcqi.m_rnti);
NS_LOG_LOGIC (this << "Enb Received DL-CQI rnti" << dlcqi.m_rnti);
m_dlCqiReceived.push_back (dlcqi);
}
@@ -753,7 +752,6 @@ LteEnbMac::DoSchedDlConfigInd (FfMacSchedSapUser::SchedDlConfigIndParameters ind
void
LteEnbMac::DoSchedUlConfigInd (FfMacSchedSapUser::SchedUlConfigIndParameters ind)
{
NS_LOG_FUNCTION (this);
for (unsigned int i = 0; i < ind.m_dciList.size (); i++)

View File

@@ -238,8 +238,7 @@ LteNetDevice::IsBridge (void) const
Address
LteNetDevice::GetMulticast (Ipv4Address multicastGroup) const
{
NS_LOG_FUNCTION (this);
NS_LOG_FUNCTION (multicastGroup);
NS_LOG_FUNCTION (this << multicastGroup);
Mac48Address ad = Mac48Address::GetMulticast (multicastGroup);

View File

@@ -202,7 +202,10 @@ LteRlcSm::DoReceivePdu (Ptr<Packet> p)
{
delay = Simulator::Now() - rlcTag.GetSenderTimestamp ();
}
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << p->GetSize () << delay.GetNanoSeconds ());
NS_LOG_LOGIC (" RNTI=" << m_rnti
<< " LCID=" << (uint32_t) m_lcid
<< " size=" << p->GetSize ()
<< " delay=" << delay.GetNanoSeconds ());
m_rxPdu(m_rnti, m_lcid, p->GetSize (), delay.GetNanoSeconds () );
}
@@ -218,7 +221,9 @@ LteRlcSm::DoNotifyTxOpportunity (uint32_t bytes)
// RLC Performance evaluation
RlcTag tag (Simulator::Now());
params.pdu->AddByteTag (tag);
NS_LOG_FUNCTION (this << m_rnti << (uint32_t) m_lcid << bytes);
NS_LOG_LOGIC (" RNTI=" << m_rnti
<< " LCID=" << (uint32_t) m_lcid
<< " size=" << bytes);
m_txPdu(m_rnti, m_lcid, bytes);
m_macSapProvider->TransmitPdu (params);

View File

@@ -170,7 +170,7 @@ TraceFadingLossModel::DoCalcRxPowerSpectralDensity (
//double speed = sqrt (pow (aSpeedVector.x-bSpeedVector.x,2) + pow (aSpeedVector.y-bSpeedVector.y,2));
NS_LOG_FUNCTION (this << *rxPsd);
NS_LOG_LOGIC (this << *rxPsd);
int now_ms = static_cast<int> (Simulator::Now ().GetMilliSeconds () * m_timeGranularity);
int lastUpdate_ms = static_cast<int> (m_lastWindowUpdate.GetMilliSeconds () * m_timeGranularity);
@@ -186,11 +186,11 @@ TraceFadingLossModel::DoCalcRxPowerSpectralDensity (
double power = *vit; // in Watt/Hz
power = 10 * log10 (180000 * power); // in dB
NS_LOG_FUNCTION (this << subChannel << *vit << power << fading);
NS_LOG_LOGIC (this << subChannel << *vit << power << fading);
*vit = pow (10., ((power + fading) / 10)) / 180000; // in Watt
NS_LOG_FUNCTION (this << subChannel << *vit);
NS_LOG_LOGIC (this << subChannel << *vit);
}
@@ -199,7 +199,7 @@ TraceFadingLossModel::DoCalcRxPowerSpectralDensity (
}
NS_LOG_FUNCTION (this << *rxPsd);
NS_LOG_LOGIC (this << *rxPsd);
return rxPsd;
}
@@ -215,10 +215,7 @@ TraceFadingLossModel::CreateFadingChannelRealization (Ptr<const MobilityModel> e
m_lastWindowUpdate = Simulator::Now ();
}
NS_LOG_FUNCTION (this <<
"insert new channel realization, m_windowOffsetMap.size () = "
<< m_windowOffsetsMap.size ());
NS_LOG_LOGIC (this << "insert new channel realization, m_windowOffsetMap.size () = " << m_windowOffsetsMap.size ());
UniformVariable* startV = new UniformVariable (1, (m_traceLength.GetSeconds () - m_windowSize.GetSeconds ()) * 1000.0);
ChannelRealizationId_t mobilityPair = std::make_pair (enbMobility,ueMobility);
m_startVariableMap.insert (std::pair<ChannelRealizationId_t,UniformVariable* > (mobilityPair, startV));

View File

@@ -524,8 +524,8 @@ TapBridge::CreateTap (void)
//
// Execute the socket creation process image.
//
status = ::execlp ("tap-creator",
"tap-creator", // argv[0] (filename)
status = ::execlp (TAP_CREATOR,
TAP_CREATOR, // argv[0] (filename)
ossDeviceName.str ().c_str (), // argv[1] (-d<device name>)
ossGateway.str ().c_str (), // argv[2] (-g<gateway>)
ossIp.str ().c_str (), // argv[3] (-i<IP address>)

View File

@@ -43,12 +43,14 @@ def build(bld):
]
if not bld.env['PLATFORM'].startswith('freebsd'):
obj = bld.create_suid_program('tap-creator')
obj.source = [
tap_creator = bld.create_suid_program('tap-creator')
tap_creator.source = [
'model/tap-creator.cc',
'model/tap-encode-decode.cc',
]
module.env.append_value("DEFINES", "TAP_CREATOR=\"%s\"" % (tap_creator.target,))
if bld.env['ENABLE_EXAMPLES']:
bld.add_subdirs('examples')

View File

@@ -541,7 +541,7 @@ class SuidBuild_task(Task.TaskBase):
super(SuidBuild_task, self).__init__(*args, **kwargs)
self.m_display = 'build-suid'
try:
program_obj = wutils.find_program(self.generator.target, self.generator.env)
program_obj = wutils.find_program(self.generator.name, self.generator.env)
except ValueError, ex:
raise WafError(str(ex))
program_node = program_obj.path.find_or_declare(program_obj.target)
@@ -558,7 +558,10 @@ class SuidBuild_task(Task.TaskBase):
def runnable_status(self):
"RUN_ME SKIP_ME or ASK_LATER"
st = os.stat(self.filename)
try:
st = os.stat(self.filename)
except OSError:
return Task.ASK_LATER
if st.st_uid == 0:
return Task.SKIP_ME
else: