{
if (!ev.disable_tracing)
{
bool l2r;
if (dynamic_cast<IPDatagram *>(msg))
{
if (((IPDatagram *)msg)->getTransportProtocol()==132)
{
tcpdump.ipDump("", (IPDatagram *)msg);
}
else
{
if (PK(msg)->hasBitError())
{
delete msg;
return;
}
l2r = msg->arrivedOn("in1");
if (((IPDatagram *)msg)->getTransportProtocol()==6)
{
tcpdump.tcpDump(l2r, "", (IPDatagram *)msg, "");
}
else if (((IPDatagram *)msg)->getTransportProtocol()==17)
tcpdump.udpDump(l2r, "", (IPDatagram *)msg, "");
}
}
else if (dynamic_cast<SCTPMessage *>(msg))
{
l2r = msg->arrivedOn("in1");
tcpdump.sctpDump("", (SCTPMessage *)msg, std::string(l2r?"A":"B"),std::string(l2r?"B":"A"));
}
else if (dynamic_cast<TCPSegment *>(msg))
{
if (PK(msg)->hasBitError())
{
delete msg;
return;
}
l2r = msg->arrivedOn("in1");
tcpdump.tcpDump(l2r, "", (TCPSegment *)msg, std::string(l2r?"A":"B"),std::string(l2r?"B":"A"));
}
else if (dynamic_cast<ICMPMessage *>(msg))
{
if (PK(msg)->hasBitError())
{
delete msg;
return;
}
std::cout<<"ICMPMessage\n";
}
else
{
cPacket *encapmsg = PK(msg);
while (encapmsg && dynamic_cast<IPDatagram *>(encapmsg)==NULL && dynamic_cast<IPv6Datagram_Base *>(encapmsg)==NULL)
encapmsg = encapmsg->getEncapsulatedMsg();
l2r = msg->arrivedOn("in1");
if (!encapmsg)
{
EV << "CANNOT DECODE: packet " << msg->getName() << " doesn't contain either IP or IPv6 Datagram\n";
}
else
{
if (dynamic_cast<IPDatagram *>(encapmsg))
tcpdump.tcpDump(l2r, "", (IPDatagram *)encapmsg);
else if (dynamic_cast<IPv6Datagram_Base *>(encapmsg))
tcpdump.dumpIPv6(l2r, "", (IPv6Datagram_Base *)encapmsg);
else
ASSERT(0);
}
}
}
if (tcpdump.dumpfile!=NULL && dynamic_cast<IPDatagram *>(msg))
{
uint8 buf[MAXBUFLENGTH];
memset((void*)&buf, 0, sizeof(buf));
const simtime_t stime = simulation.getSimTime();
struct pcaprec_hdr ph;
ph.ts_sec = (int32)stime.dbl();
ph.ts_usec = (uint32)((stime.dbl() - ph.ts_sec)*1000000);
uint32 hdr = 2;
IPDatagram *ipPacket = check_and_cast<IPDatagram *>(msg);
int32 serialized_ip = IPSerializer().serialize(ipPacket, buf, sizeof(buf));
ph.incl_len = serialized_ip + sizeof(uint32);
ph.orig_len = ph.incl_len;
fwrite(&ph, sizeof(ph), 1, tcpdump.dumpfile);
fwrite(&hdr, sizeof(uint32), 1, tcpdump.dumpfile);
fwrite(buf, serialized_ip, 1, tcpdump.dumpfile);
}
int32 index = msg->getArrivalGate()->getIndex();
int32 id;
if (msg->getArrivalGate()->isName("ifIn"))
id = findGate("out2",index);
else
id = findGate("ifOut",index);
send(msg, id);
}