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:

+ +

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 ============== diff --git a/src/click/model/ipv4-click-routing.cc b/src/click/model/ipv4-click-routing.cc index faf74292e..7e8f97031 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 (); @@ -416,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 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 ()) .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; 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 */ 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') diff --git a/wscript b/wscript index a913bffee..352cdf3df 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) @@ -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: