Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/inet/networklayer/icmpv6/Ipv6NeighbourDiscovery.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1211,8 +1211,11 @@ void Ipv6NeighbourDiscovery::processRsPacket(Packet *packet, const Ipv6RouterSol
scheduleAt(scheduledTime, msg);
advIfEntry->nextScheduledRATime = scheduledTime;
}
else
else {
EV_DETAIL << "A multicast RA is already scheduled at " << advIfEntry->nextScheduledRATime
<< "; it will serve this solicitation\n";
delete msg;
}
}
else {
EV_INFO << "This interface is a host, discarding RA message\n";
Expand Down Expand Up @@ -1727,6 +1730,17 @@ void Ipv6NeighbourDiscovery::sendSolicitedRa(cMessage *msg)
Ipv6Address destAddr = Ipv6Address("FF02::1");
EV_DETAIL << "Testing condition!\n";
createAndSendRaPacket(destAddr, ie);

/*When this advertisement was scheduled it became the next multicast Router
Advertisement to be sent, so nextScheduledRATime was set to its send time
(RFC 4861 Section 6.2.6). It has now been sent, and the next multicast
advertisement is the pending periodic one again. Point nextScheduledRATime back
at it; left in the past, it would make every later solicitation compare against
an advertisement that has already gone out, and be ignored for as long as no
periodic advertisement is sent.*/
if (AdvIfEntry *advIfEntry = fetchAdvIfEntry(ie))
advIfEntry->nextScheduledRATime = advIfEntry->raTimeoutMsg->getArrivalTime();

delete msg;
}

Expand Down
12 changes: 6 additions & 6 deletions tests/fingerprint/examples.csv
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@

# /examples/inet/hierarchical99/, -f .qtenv.ini -c General -r 0
/examples/inet/hierarchical99/, -f networklayer.ini -c IPv4 -r 0, 10000s, a94d-edae/tplx;1f32-e325/~tNl;b138-ee8b/~tND;66c9-cd73/tyf, PASS, EthernetMac Ipv4
/examples/inet/hierarchical99/, -f networklayer.ini -c IPv6 -r 0, 10000s, 0001-0108/tplx;3960-479e/~tNl;add1-e848/~tND;2c03-abef/tyf, PASS, EthernetMac
/examples/inet/hierarchical99/, -f networklayer.ini -c IPv6 -r 0, 10000s, 856e-a5fa/tplx;079d-3888/~tNl;1e2a-3d3b/~tND;2c03-abef/tyf, PASS, EthernetMac
/examples/inet/hierarchical99/, -f networklayer.ini -c Generic -r 0, 10000s, 6ae4-6e75/tplx;2209-80ac/~tNl;93bf-6657/tyf, PASS, EthernetMac
/examples/inet/hierarchical99/, -f networklayer.ini -c Flooding -r 0, 10000s, 7ba7-5b91/tplx;b0f0-411e/~tNl;2b94-8906/tyf, PASS, EthernetMac
/examples/inet/hierarchical99/, -f networklayer.ini -c ProbabilisticBroadcast -r 0, 10000s, 5a54-9779/tplx;1165-a70b/~tNl;760b-abfc/tyf, PASS, EthernetMac
Expand Down Expand Up @@ -380,7 +380,7 @@
/examples/manetrouting/multiradio/, -f omnetpp.ini -c MultiRadio -r 0, 20s, ec17-5cc2/tplx;55f5-0894/~tNl, PASS, wireless adhoc Ipv4
/examples/manetrouting/multiradio/, -f omnetpp.ini -c SingleRadio -r 0, 20s, 85a0-51b8/tplx;c07a-44e1/~tNl;3aa0-49ed/tyf, PASS, wireless adhoc Ipv4

/examples/ipv6/mipv6/, -f omnetpp.ini -c Handover -r 0, 70s, 19b8-20a4/tplx;b378-071d/~tNl;d358-e3bb/~tND;44ef-1a45/tyf, PASS, wireless EthernetMac
/examples/ipv6/mipv6/, -f omnetpp.ini -c Handover -r 0, 70s, dfc0-8b68/tplx;e31e-d2fb/~tNl;3026-672f/~tND;44ef-1a45/tyf, PASS, wireless EthernetMac
/examples/ipv6/mipv6/, -f omnetpp.ini -c RouteOptimizationTwoCNs -r 0, 60s, 3f0c-078d/tplx;04e1-1f03/~tNl;4199-2b15/~tND;ed3e-17fa/tyf, PASS, wireless EthernetMac
/examples/ipv6/mipv6roaming/, -f omnetpp.ini -c Roaming -r 0, 70s, 0798-40c2/tplx;a682-8d0e/~tNl;cdb7-1b34/~tND;afae-2b3c/tyf, PASS, wireless EthernetMac
/examples/ipv6/pmipv6/, -f omnetpp.ini -c General -r 0, 60s, f614-da0d/tplx;8b55-7191/~tNl;b490-dc09/~tND;0277-d784/tyf, PASS, wireless EthernetMac
Expand Down Expand Up @@ -453,10 +453,10 @@
/examples/ospfv2/simpletest/, -f omnetpp.ini -c ShutdownAndRestart -r 0, 500s, fbe5-93ad/tplx;bc6e-6aa5/~tNl;1700-f363/~tND;7e87-b79f/tyf, PASS, EthernetMac Ipv4
/examples/ospfv2/simpletest/, -f omnetpp.ini -c CrashAndReboot -r 0, 500s, 73cc-e6f7/tplx;bc6e-6aa5/~tNl;1700-f363/~tND;8ea5-1a49/tyf, PASS, EthernetMac Ipv4

/examples/ospfv3/multiple_areas_FINAL/, -f omnetpp.ini -c General -r 0, 500s, 5a6c-7b26/tplx;1cb8-4b4c/~tNl;c96e-af34/tyf;2d23-dc61/~tND, PASS, EthernetMac
/examples/ospfv3/multiple_areas_FINAL/, -f omnetpp.ini -c LinkDown -r 0, 500s, 0a8e-1d2c/tplx;026a-465c/~tNl;058d-fbf3/tyf;5859-a357/~tND, PASS, EthernetMac
/examples/ospfv3/multiple_areas_FINAL/, -f omnetpp.ini -c LinkDownLinkUp -r 0, 500s, ca28-5d2b/tplx;e812-c9a5/~tNl;7d65-aa4c/tyf;8767-9c3b/~tND, PASS, EthernetMac
/examples/ospfv3/small/, -f omnetpp.ini -c General -r 0, 200s, a507-2349/tplx;78bf-31e2/~tNl;441a-9244/tyf;4b8b-fb7a/~tND, PASS, EthernetMac
/examples/ospfv3/multiple_areas_FINAL/, -f omnetpp.ini -c General -r 0, 500s, 645d-012f/tplx;98be-431d/~tNl;c96e-af34/tyf;29c8-752d/~tND, PASS, EthernetMac
/examples/ospfv3/multiple_areas_FINAL/, -f omnetpp.ini -c LinkDown -r 0, 500s, 86d0-9f63/tplx;447a-5e7d/~tNl;058d-fbf3/tyf;0b58-99bd/~tND, PASS, EthernetMac
/examples/ospfv3/multiple_areas_FINAL/, -f omnetpp.ini -c LinkDownLinkUp -r 0, 500s, 6abb-be3c/tplx;e043-4da3/~tNl;7d65-aa4c/tyf;838c-3577/~tND, PASS, EthernetMac
/examples/ospfv3/small/, -f omnetpp.ini -c General -r 0, 200s, 13b1-1693/tplx;806f-af9b/~tNl;441a-9244/tyf;d9d2-cb28/~tND, PASS, EthernetMac
/examples/ospfv3/v3_2_routers/, -f omnetpp.ini -c General -r 0, 400s, b94b-8c51/tplx;536c-1525/~tNl;993e-1af3/tyf;bb52-b309/~tND, PASS, EthernetMac
/examples/ospfv3/v3_2_routers/, -f omnetpp.ini -c LinkDownAndUp -r 0, 400s, 24d9-8a90/tplx;d598-192b/~tNl;c4df-4e3f/tyf;b19b-722d/~tND, PASS, EthernetMac
/examples/ospfv3/v3_3_areas/, -f omnetpp.ini -c General -r 0, 3000s, 7cc4-6f54/tplx;18bf-6f31/~tNl;ddbf-753a/tyf;89ed-849f/~tND, PASS, EthernetMac
Expand Down
6 changes: 3 additions & 3 deletions tests/fingerprint/mipv6-refactoring.csv
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# empty-shim step, which kept these fingerprints bit-for-bit identical.

# MIPv6 example — the primary test
/examples/ipv6/mipv6/, -f omnetpp.ini -c Handover -r 0, 70s, aa29-a8c5/~tNlb, PASS, wireless EthernetMac
/examples/ipv6/mipv6/, -f omnetpp.ini -c Handover -r 0, 70s, bf13-d7e0/~tNlb, PASS, wireless EthernetMac
/examples/ipv6/mipv6/, -f omnetpp.ini -c RouteOptimizationTwoCNs -r 0, 60s, 068b-23aa/~tNlb, PASS, wireless EthernetMac
/examples/ipv6/mipv6roaming/, -f omnetpp.ini -c Roaming -r 0, 70s, c8dc-27c2/~tNlb, PASS, wireless EthernetMac

Expand All @@ -17,13 +17,13 @@
# ~tNlb excluded: EthernetHub (WireJunction) adds a pointer-typed 'originalSender' cPar to the signal which
# causes parsimPack() to abort — use ~tNl (no parsim serialization) instead; tyf excluded as unreliable
/examples/ipv6/mld/, -f omnetpp.ini -c MldDemo -r 0, 30s, f1b1-b523/~tNl, PASS, EthernetMac MLD
/examples/ipv6/mld/, -f omnetpp.ini -c MldV2Ssm -r 0, 30s, a22a-81c9/~tNl, PASS, EthernetMac MLD
/examples/ipv6/mld/, -f omnetpp.ini -c MldV2Ssm -r 0, 30s, e849-1de6/~tNl, PASS, EthernetMac MLD
/examples/ipv6/nclients/, -f omnetpp.ini -c ETH -r 0, 1000s, 50c9-9bb3/~tNlb, PASS, EthernetMac
/examples/ipv6/nclients/, -f omnetpp.ini -c PPP -r 0, 1000s, 0e0c-b800/~tNlb, PASS,
/examples/ipv6/nclients/, -f omnetpp.ini -c PPP_SCTP -r 0, 100s, 06b9-ff17/~tNlb, PASS,

# IPv6 networking examples
/examples/inet/hierarchical99/, -f networklayer.ini -c IPv6 -r 0, 10000s, f206-a0e2/~tNlb, PASS, EthernetMac
/examples/inet/hierarchical99/, -f networklayer.ini -c IPv6 -r 0, 10000s, aa68-afc5/~tNlb, PASS, EthernetMac
/examples/inet/udpclientserver/, -f omnetpp.ini -c udp_OK_ipv6 -r 0, 10s, 8feb-3936/~tNlb, PASS,
/examples/inet/udpclientserver/, -f omnetpp.ini -c udp_Port_Unav_ipv6 -r 0, 10s, 9661-c1f5/~tNlb, PASS,
/examples/inet/udpclientserver/, -f omnetpp.ini -c udp_Host_Unav_ipv6 -r 0, 10s, 6360-9ed1/~tNlb, PASS,
Expand Down
107 changes: 107 additions & 0 deletions tests/module/IPv6_RA_repeated_solicitations.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
%description:
Tests that an IPv6 router answers every valid Router Solicitation, not just the
first one on an advertising interface (RFC 4861 Section 6.2.6).

hostA and hostB share a link with router R. hostA solicits first and is answered.
hostB is then shut down and restarted at t=20s, so it loses its addresses and has
to perform Router Discovery again, at a time when no periodic Router Advertisement
is due (the RFC 4861 default MinRtrAdvInterval/MaxRtrAdvInterval of 200s/600s are
far longer than hostB's MAX_RTR_SOLICITATIONS budget of about 9s).

The router must answer hostB's solicitation. If it does not, hostB gives up with
"No RA messages were received", never autoconfigures a global address, and its
traffic to srv is silently lost while the run still exits with status 0.

%#--------------------------------------------------------------------------------------------------------------
%file: test.ned
import inet.common.scenario.ScenarioManager;
import inet.networklayer.configurator.ipv6.Ipv6FlatNetworkConfigurator;
import inet.node.ethernet.EthernetSwitch;
import inet.node.ipv6.Router6;
import inet.node.ipv6.StandardHost6;
import ned.DatarateChannel;

network RepeatedSolicitations
{
types:
channel ethline extends DatarateChannel
{
delay = 0.1us;
datarate = 10Mbps;
}
submodules:
scenarioManager: ScenarioManager;
configurator: Ipv6FlatNetworkConfigurator;
switch: EthernetSwitch;
R: Router6;
hostA: StandardHost6;
hostB: StandardHost6;
srv: StandardHost6;
connections:
hostA.ethg++ <--> ethline <--> switch.ethg++;
hostB.ethg++ <--> ethline <--> switch.ethg++;
R.ethg++ <--> ethline <--> switch.ethg++;
R.ethg++ <--> ethline <--> srv.ethg++;
}
%#--------------------------------------------------------------------------------------------------------------
%inifile: omnetpp.ini
[General]
record-vector-results = false
ned-path = ../../../../src
network = RepeatedSolicitations
sim-time-limit = 60s
cmdenv-express-mode = false
cmdenv-log-prefix = "%C: "

**.hasStatus = true
**.scenarioManager.script = xmldoc("scenario.xml")

# RFC 4861 defaults, and also INET's own NED defaults
**.R.ipv6.neighbourDiscovery.minIntervalBetweenRAs = 200s
**.R.ipv6.neighbourDiscovery.maxIntervalBetweenRAs = 600s

# udp apps
**.hostB.numApps = 1
**.hostB.app[0].typename = "UdpBasicApp"
**.hostB.app[0].destAddresses = "srv"
**.hostB.app[0].destPort = 1000
**.hostB.app[0].messageLength = 64B
**.hostB.app[0].startTime = 40s
**.hostB.app[0].sendInterval = 1s

**.srv.numApps = 1
**.srv.app[0].typename = "UdpSink"
**.srv.app[0].localPort = 1000

# Ethernet NIC configuration
**.eth[*].queue.typename = "EthernetQosQueue"
**.eth[*].queue.dataQueue.typename = "DropTailQueue"
**.eth[*].queue.dataQueue.packetCapacity = 10

%#--------------------------------------------------------------------------------------------------------------
%file: scenario.xml

<scenario>
<at t="1.0">
<shutdown module="hostB"/>
</at>
<at t="20.0">
<startup module="hostB"/>
</at>
</scenario>

%#--------------------------------------------------------------------------------------------------------------
%subst: /omnetpp:://
%#--------------------------------------------------------------------------------------------------------------
%not-contains: stdout
No RA messages were received
%#--------------------------------------------------------------------------------------------------------------
%contains: stdout
RepeatedSolicitations.hostB.ipv6.neighbourDiscovery: Assigning new address to: eth0
%#--------------------------------------------------------------------------------------------------------------
%contains: stdout
RepeatedSolicitations.srv.app[0]: received 20 packets
%#--------------------------------------------------------------------------------------------------------------
%postrun-command: grep "undisposed object:" test.out > test_undisposed.out || true
%not-contains: test_undisposed.out
undisposed object: (