Skip to content

Commit 1c4ebc8

Browse files
committed
IpvxTrafGen, IpvxTrafSink: handle non-packet messages gracefully
Use isPacket() to distinguish packets from other message types (e.g. ICMP error Indications). Log a warning and delete non-packet messages instead of crashing with check_and_cast.
1 parent 0b069a9 commit 1c4ebc8

2 files changed

Lines changed: 33 additions & 20 deletions

File tree

src/inet/applications/generic/IpvxTrafGen.cc

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,37 @@ void IpvxTrafGen::startApp()
8080

8181
void IpvxTrafGen::handleMessageWhenUp(cMessage *msg)
8282
{
83-
if (msg == timer) {
84-
if (msg->getKind() == START) {
85-
destAddresses.clear();
86-
const char *destAddrs = par("destAddresses");
87-
cStringTokenizer tokenizer(destAddrs);
88-
const char *token;
89-
while ((token = tokenizer.nextToken()) != nullptr) {
90-
L3Address result;
91-
L3AddressResolver().tryResolve(token, result);
92-
if (result.isUnspecified())
93-
EV_ERROR << "cannot resolve destination address: " << token << endl;
94-
else
95-
destAddresses.push_back(result);
83+
if (msg->isSelfMessage()) {
84+
if (msg == timer) {
85+
if (msg->getKind() == START) {
86+
destAddresses.clear();
87+
const char *destAddrs = par("destAddresses");
88+
cStringTokenizer tokenizer(destAddrs);
89+
const char *token;
90+
while ((token = tokenizer.nextToken()) != nullptr) {
91+
L3Address result;
92+
L3AddressResolver().tryResolve(token, result);
93+
if (result.isUnspecified())
94+
EV_ERROR << "cannot resolve destination address: " << token << endl;
95+
else
96+
destAddresses.push_back(result);
97+
}
98+
}
99+
if (!destAddresses.empty()) {
100+
sendPacket();
101+
if (isEnabled())
102+
scheduleNextPacket(simTime());
96103
}
97104
}
98-
if (!destAddresses.empty()) {
99-
sendPacket();
100-
if (isEnabled())
101-
scheduleNextPacket(simTime());
102-
}
105+
else
106+
throw cRuntimeError("Model error: unknown self message");
103107
}
104-
else
108+
else if (msg->isPacket())
105109
processPacket(check_and_cast<Packet *>(msg));
110+
else {
111+
EV_WARN << "Received non-packet message: " << msg->getName() << "\n";
112+
delete msg;
113+
}
106114
}
107115

108116
void IpvxTrafGen::scheduleNextPacket(simtime_t previous)

src/inet/applications/generic/IpvxTrafSink.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ void IpvxTrafSink::initialize(int stage)
4343

4444
void IpvxTrafSink::handleMessageWhenUp(cMessage *msg)
4545
{
46-
processPacket(check_and_cast<Packet *>(msg));
46+
if (msg->isPacket())
47+
processPacket(check_and_cast<Packet *>(msg));
48+
else {
49+
EV_WARN << "Received non-packet message: " << msg->getName() << "\n";
50+
delete msg;
51+
}
4752
}
4853

4954
void IpvxTrafSink::printPacket(Packet *msg)

0 commit comments

Comments
 (0)