ns3::Ipv4Interface::IsUp() const (ipv4-interface.cc:174) Invalid read
ns-3 version: 3.32
System: Fedora33
no modifications to the ns3-core
The only modification is adding the https://github.com/MarshallAsch/rhpman module to the contrib
directory
Description:
In some situations ns-3 simulations crash with an invalid read error. It does not seem to occur every time or with any particular set of configurations. The error occurs roughly 0.27% of the time (of 7800 runs). (not very many I know). The error in the stack trace shown below occurred roughly 15 hours into a debug simulation run (an optimized run generally takes about 20 minutes) so its not the easiest thing to test for.
Expected behaviour For the simulation to not crash unexpectedly
Reproduction
The issue does not seem to happen with every input set, but when the same set of flags is used it will happen every time. If any value is changed, including the RngRun
option the error might not occur.
The module is a MANET storage scheme module that is based on DSDV, a IPv4 wifi ad hoc network, and UDP network transmissions. Destination addresses of nodes are selected by converting the nodes src addresses to an int32 then back into an IPv4Address (this is done for separate mapping purposes).
Repeating the issue A prebuilt docker container showing the issue can be found here:
$ docker run -it --rm marshallasch/rhpman:debug
# apt-get update && apt-get install gdb valgrind -y
# ./waf --gdb --run "rhpman-example \
--runTime=2400 --waitTime=600 --lookupTime=30 --updateTime=120 \
--dataSize=512 --profileUpdateDelay=6 --totalNodes=160 \
--storageSpace=160 --bufferSpace=160 --wcdc=0.5 --wcol=0.5 --hops=2 \
--replicationHops=4 --carryingThreshold=0.7 --forwardingThreshold=0.6 \
--percentDataOwners=10 --areaWidth=1000 --areaLength=1000 --gridRows=4 \
--gridCols=4 --wifiRadius=100 --partitionNodes=8 --travellerVelocity=20 \
--travellerWalkMode=time --travellerWalkTime=100 --pbnVelocityMin=1 \
--pbnVelocityMax=10 --pbnVelocityChangeAfter=100 --routing=dsdv \
--travellerWalkDist=0 --requestTimeout=0 --peerTimeout=12 \
--electionPeriod=6 --electionCooldown=6 --storageWeight=0.5 \
--energyWeight=0.5 --processingWeight=0 --lowPowerThreshold=0.4 \
--staggeredStart=False --optionCarrierForwarding=False \
--optionalCheckBuffer=False --optionalNoEmptyTransfers=False --RngRun=1634"
Issue can be seen in this project: https://github.com/MarshallAsch/rhpman/issues/15
Valgrind stack trace:
==410235== Using Valgrind-3.16.1 and LibVEX; rerun with -h for copyright info
==410235== Command: ns-3-allinone/ns-3.32/build/optimized/contrib/rhpman/examples/ns3.32-rhpman-example-optimized --runTime=2400 --waitTime=600 --lookupTime=30 --updateTime=120 --dataSize=512 --profileUpdateDelay=6 --totalNodes=200 --storageSpace=200 --bufferSpace=200 --wcdc=0.5 --wcol=0.5 --carryingThreshold=0.6 --forwardingThreshold=0.3 -
-hops=2 --replicationHops=4 --percentDataOwners=10 --areaWidth=1000 --areaLength=1000 --gridRows=4 --gridCols=4 --wifiRadius=100 --partitionNodes=8 --travellerVelocity=20 --travellerWalkMode=time --travellerWalkTime=100 --pbnVelocityMin=1 --pbnVelocityMax=10 --pbnVelocityChangeAfter=100 --routing=dsdv --travellerWalkDist=0 --RngRun=951
==410235==
==410235== Invalid read of size 1
==410235== at 0x53C2760: ns3::Ipv4Interface::IsUp() const (ipv4-interface.cc:174)
==410235== by 0x53C9974: ns3::Ipv4L3Protocol::SendRealOut(ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet>, ns3::Ipv4Header const&) (ipv4-l3-protocol.cc:989)
==410235== by 0x53CACAD: ns3::Ipv4L3Protocol::IpForward(ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&) (ipv4-l3-protocol.cc:1084)
==410235== by 0x53D83BB: ns3::MemPtrCallbackImpl<ns3::Ipv4L3Protocol*, void (ns3::Ipv4L3Protocol::*)(ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&), void, ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Ipv4Route>, ns
3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&) (callback.h:646)
==410235== by 0x4922140: operator() (callback.h:1430)
==410235== by 0x4922140: ns3::dsdv::RoutingProtocol::SendPacketFromQueue(ns3::Ipv4Address, ns3::Ptr<ns3::Ipv4Route>) (dsdv-routing-protocol.cc:1175)
==410235== by 0x49228C6: ns3::dsdv::RoutingProtocol::LookForQueuedPackets() (dsdv-routing-protocol.cc:1148)
==410235== by 0x49234A7: ns3::dsdv::RoutingProtocol::RouteOutput(ns3::Ptr<ns3::Packet>, ns3::Ipv4Header const&, ns3::Ptr<ns3::NetDevice>, ns3::Socket::SocketErrno&) (dsdv-routing-protocol.cc:307)
==410235== by 0x540B668: ns3::UdpSocketImpl::DoSendTo(ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, unsigned short, unsigned char) (udp-socket-impl.cc:621)
==410235== by 0x540D38F: ns3::UdpSocketImpl::SendTo(ns3::Ptr<ns3::Packet>, unsigned int, ns3::Address const&) (udp-socket-impl.cc:810)
==410235== by 0x4928BF5: ns3::dsdv::RoutingProtocol::SendTriggeredUpdate() (dsdv-routing-protocol.cc:861)
==410235== by 0x6223329: ns3::DefaultSimulatorImpl::ProcessOneEvent() (default-simulator-impl.cc:151)
==410235== by 0x622337D: ns3::DefaultSimulatorImpl::Run() (default-simulator-impl.cc:204)
==410235== Address 0x1c is not stack'd, malloc'd or (recently) free'd
==410235==
==410235==
==410235== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==410235== Access not within mapped region at address 0x1C
==410235== at 0x53C2760: ns3::Ipv4Interface::IsUp() const (ipv4-interface.cc:174)
==410235== by 0x53C9974: ns3::Ipv4L3Protocol::SendRealOut(ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet>, ns3::Ipv4Header const&) (ipv4-l3-protocol.cc:989)
==410235== by 0x53CACAD: ns3::Ipv4L3Protocol::IpForward(ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&) (ipv4-l3-protocol.cc:1084)
==410235== by 0x53D83BB: ns3::MemPtrCallbackImpl<ns3::Ipv4L3Protocol*, void (ns3::Ipv4L3Protocol::*)(ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&), void, ns3::Ptr<ns3::Ipv4Route>, ns3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<ns3::Ipv4Route>, ns
3::Ptr<ns3::Packet const>, ns3::Ipv4Header const&) (callback.h:646)
==410235== by 0x4922140: operator() (callback.h:1430)
==410235== by 0x4922140: ns3::dsdv::RoutingProtocol::SendPacketFromQueue(ns3::Ipv4Address, ns3::Ptr<ns3::Ipv4Route>) (dsdv-routing-protocol.cc:1175)
==410235== by 0x49228C6: ns3::dsdv::RoutingProtocol::LookForQueuedPackets() (dsdv-routing-protocol.cc:1148)
==410235== by 0x49234A7: ns3::dsdv::RoutingProtocol::RouteOutput(ns3::Ptr<ns3::Packet>, ns3::Ipv4Header const&, ns3::Ptr<ns3::NetDevice>, ns3::Socket::SocketErrno&) (dsdv-routing-protocol.cc:307)
==410235== by 0x540B668: ns3::UdpSocketImpl::DoSendTo(ns3::Ptr<ns3::Packet>, ns3::Ipv4Address, unsigned short, unsigned char) (udp-socket-impl.cc:621)
==410235== by 0x540D38F: ns3::UdpSocketImpl::SendTo(ns3::Ptr<ns3::Packet>, unsigned int, ns3::Address const&) (udp-socket-impl.cc:810)
==410235== by 0x4928BF5: ns3::dsdv::RoutingProtocol::SendTriggeredUpdate() (dsdv-routing-protocol.cc:861)
==410235== by 0x6223329: ns3::DefaultSimulatorImpl::ProcessOneEvent() (default-simulator-impl.cc:151)
==410235== by 0x622337D: ns3::DefaultSimulatorImpl::Run() (default-simulator-impl.cc:204)
==410235== If you believe this happened as a result of a stack
==410235== overflow in your program's main thread (unlikely but
==410235== possible), you can try to increase the size of the
==410235== main thread stack using the --main-stacksize= flag.
==410235== The main thread stack size used in this run was 8388608.
==410235==
This stack trace was generated with this version of the module, but it happens with all later versions as well.