merge ns-3-lena-dev and ns-3-dev

This commit is contained in:
Nicola Baldo
2012-01-30 12:26:03 +01:00
12 changed files with 157 additions and 21 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

@@ -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: