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