From 1d540581a27286a2d8c7ad067bb4ac912f72fb68 Mon Sep 17 00:00:00 2001 From: Sascha Alexander Jopen Date: Fri, 20 Jan 2012 16:04:07 +0100 Subject: [PATCH 01/10] Shutdown Click router during Ipv4ClickRouting::DoDispose() --- src/click/model/ipv4-click-routing.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/click/model/ipv4-click-routing.cc b/src/click/model/ipv4-click-routing.cc index faf74292e..2d5e239c4 100644 --- a/src/click/model/ipv4-click-routing.cc +++ b/src/click/model/ipv4-click-routing.cc @@ -114,6 +114,7 @@ Ipv4ClickRouting::SetIpv4 (Ptr ipv4) void Ipv4ClickRouting::DoDispose () { + simclick_click_kill (m_simNode); m_ipv4 = 0; delete m_simNode; Ipv4RoutingProtocol::DoDispose (); From 370c4b35606f85e95e3d3b76f8568c485b861b9e Mon Sep 17 00:00:00 2001 From: Lalith Suresh Date: Fri, 20 Jan 2012 17:08:11 +0100 Subject: [PATCH 02/10] Fix memory leak with Ipv4ClickRouting::ReadHandler() --- src/click/model/ipv4-click-routing.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/click/model/ipv4-click-routing.cc b/src/click/model/ipv4-click-routing.cc index 2d5e239c4..7e8f97031 100644 --- a/src/click/model/ipv4-click-routing.cc +++ b/src/click/model/ipv4-click-routing.cc @@ -417,8 +417,15 @@ Ipv4ClickRouting::Receive (Ptr 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 From fd760775bde531094e364632e07f8dfdbfee572e Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Fri, 20 Jan 2012 20:05:33 +0000 Subject: [PATCH 03/10] Fix issue with --enable-sudo, broken by the versioning of programs --- wscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wscript b/wscript index a913bffee..7f46cb9e0 100644 --- a/wscript +++ b/wscript @@ -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) From e6806b35f6a2ff713b5aff17669177e1beb4edc6 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Mon, 23 Jan 2012 11:11:08 +0000 Subject: [PATCH 04/10] Fix small bug in SuidBuild_task --- wscript | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wscript b/wscript index 7f46cb9e0..352cdf3df 100644 --- a/wscript +++ b/wscript @@ -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: From af8b4891d6abd37925239f696b3d4bcfeaa98b83 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Mon, 23 Jan 2012 11:50:25 +0000 Subject: [PATCH 05/10] Make sure the call tap-creator with the new program name --- src/tap-bridge/model/tap-bridge.cc | 4 ++-- src/tap-bridge/wscript | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/tap-bridge/model/tap-bridge.cc b/src/tap-bridge/model/tap-bridge.cc index 4a0ea6326..fe5fd0d68 100644 --- a/src/tap-bridge/model/tap-bridge.cc +++ b/src/tap-bridge/model/tap-bridge.cc @@ -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) ossGateway.str ().c_str (), // argv[2] (-g) ossIp.str ().c_str (), // argv[3] (-i) diff --git a/src/tap-bridge/wscript b/src/tap-bridge/wscript index ab1376b60..376adffed 100644 --- a/src/tap-bridge/wscript +++ b/src/tap-bridge/wscript @@ -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') From 251ddfc332c802423f8bb8de353a0d37d4884a37 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Mon, 23 Jan 2012 11:53:28 +0000 Subject: [PATCH 06/10] Idem for the emu-sock-creator --- src/emu/model/emu-net-device.cc | 4 ++-- src/emu/wscript | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/emu/model/emu-net-device.cc b/src/emu/model/emu-net-device.cc index ef4dd217d..450aa6d04 100644 --- a/src/emu/model/emu-net-device.cc +++ b/src/emu/model/emu-net-device.cc @@ -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 Date: Wed, 25 Jan 2012 19:13:11 +0100 Subject: [PATCH 07/10] Bug 1319 - Fix Ipv6RawSocketImpl Icmpv6 filter --- src/internet/model/ipv6-raw-socket-impl.cc | 43 ++++++++++++++++--- src/internet/model/ipv6-raw-socket-impl.h | 49 +++++++++++++++++++++- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/src/internet/model/ipv6-raw-socket-impl.cc b/src/internet/model/ipv6-raw-socket-impl.cc index 9d519e89d..2b34bd05f 100644 --- a/src/internet/model/ipv6-raw-socket-impl.cc +++ b/src/internet/model/ipv6-raw-socket-impl.cc @@ -51,10 +51,6 @@ TypeId Ipv6RawSocketImpl::GetTypeId () UintegerValue (0), MakeUintegerAccessor (&Ipv6RawSocketImpl::m_protocol), MakeUintegerChecker ()) - .AddAttribute ("IcmpFilter", "Any ICMPv6 header whose type field matches a bit in this filter is dropped.", - UintegerValue (0), - MakeUintegerAccessor (&Ipv6RawSocketImpl::m_icmpFilter), - MakeUintegerChecker ()) ; 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 p, Ipv6Header hdr, PtrPeekHeader (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 */ diff --git a/src/internet/model/ipv6-raw-socket-impl.h b/src/internet/model/ipv6-raw-socket-impl.h index 10581a447..c50f5dfb4 100644 --- a/src/internet/model/ipv6-raw-socket-impl.h +++ b/src/internet/model/ipv6-raw-socket-impl.h @@ -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 */ From 75d8bc67700bf8964b30125792486b87e7134bbe Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Wed, 25 Jan 2012 19:16:56 +0100 Subject: [PATCH 08/10] Bug 1319 - Clarify Ipv4RawSocketImpl ICMP filter limitations --- src/internet/model/ipv4-raw-socket-impl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/internet/model/ipv4-raw-socket-impl.cc b/src/internet/model/ipv4-raw-socket-impl.cc index bcc26e8be..8fc84f031 100644 --- a/src/internet/model/ipv4-raw-socket-impl.cc +++ b/src/internet/model/ipv4-raw-socket-impl.cc @@ -29,7 +29,7 @@ Ipv4RawSocketImpl::GetTypeId (void) MakeUintegerAccessor (&Ipv4RawSocketImpl::m_protocol), MakeUintegerChecker ()) .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 ()) @@ -326,7 +326,7 @@ Ipv4RawSocketImpl::ForwardUp (Ptr p, Ipv4Header ipHeader, PtrPeekHeader (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; From 9be79255112cdf1044b5a30b6390e06c325b6840 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Thu, 26 Jan 2012 19:22:49 +0100 Subject: [PATCH 09/10] Update Changes.html and Release_notes with the latest -dev info --- CHANGES.html | 10 ++++++++++ RELEASE_NOTES | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/CHANGES.html b/CHANGES.html index af79cd803..93c27fe20 100644 --- a/CHANGES.html +++ b/CHANGES.html @@ -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.

+
+

Changes from ns-3.13 to ns-3-dev

+ +

Changes to existing API:

+
    +
  • The Ipv6RawSocketImpl "IcmpFilter" attribute has been removed. Six +new member functions have been added to enable the same functionality. +
  • +
+

Changes from ns-3.12 to ns-3.13

diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 1a4492a9c..cbe7ef562 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -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 ============== From 42c93dd71537de7d88d32e8a8e6ec56ee6c9be5a Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Sun, 29 Jan 2012 01:14:23 +0100 Subject: [PATCH 10/10] Bug 1109 - Point out the effects of ArpCache::PendingQueueSize attribute --- src/internet/doc/internet-stack.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/internet/doc/internet-stack.rst b/src/internet/doc/internet-stack.rst index 23582c735..81cc7b32f 100644 --- a/src/internet/doc/internet-stack.rst +++ b/src/internet/doc/internet-stack.rst @@ -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