Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <omnetpp.h>
00025 #include "IPv6ErrorHandling.h"
00026 #include "IPv6ControlInfo.h"
00027 #include "IPv6Datagram.h"
00028
00029 Define_Module(IPv6ErrorHandling);
00030
00031 void IPv6ErrorHandling::initialize()
00032 {
00033 }
00034
00035 void IPv6ErrorHandling::handleMessage(cMessage *msg)
00036 {
00037 ICMPv6Message *icmpv6Msg = check_and_cast<ICMPv6Message *>(msg);
00038 IPv6Datagram *d = check_and_cast<IPv6Datagram *>(icmpv6Msg->getEncapsulatedMsg());
00039 int type = (int)icmpv6Msg->getType();
00040 int code;
00041 EV << " Type: " << type;
00042 if (dynamic_cast<ICMPv6DestUnreachableMsg *>(icmpv6Msg))
00043 {
00044 ICMPv6DestUnreachableMsg *msg2 = (ICMPv6DestUnreachableMsg *)icmpv6Msg;
00045 code = msg2->getCode();
00046 EV << " Code: " << code;
00047 }
00048 else if (dynamic_cast<ICMPv6PacketTooBigMsg *>(icmpv6Msg))
00049 {
00050 ICMPv6PacketTooBigMsg *msg2 = (ICMPv6PacketTooBigMsg *)icmpv6Msg;
00051 code = 0;
00052 }
00053 else if (dynamic_cast<ICMPv6TimeExceededMsg *>(icmpv6Msg))
00054 {
00055 ICMPv6TimeExceededMsg *msg2 = (ICMPv6TimeExceededMsg *)icmpv6Msg;
00056 code = msg2->getCode();
00057 EV << " Code: " << code;
00058 }
00059 else if (dynamic_cast<ICMPv6ParamProblemMsg *>(icmpv6Msg))
00060 {
00061 ICMPv6ParamProblemMsg *msg2 = (ICMPv6ParamProblemMsg *)icmpv6Msg;
00062 code = msg2->getCode();
00063 EV << " Code: " << code;
00064 }
00065
00066 EV << " Byte length: " << d->getByteLength()
00067 << " Src: " << d->getSrcAddress()
00068 << " Dest: " << d->getDestAddress()
00069 << " Time: " << simTime()
00070 << "\n";
00071
00072 if (type == 1)
00073 displayType1Msg(code);
00074 else if (type == 2)
00075 displayType2Msg();
00076 else if (type == 3)
00077 displayType3Msg(code);
00078 else if (type == 4)
00079 displayType4Msg(code);
00080 else
00081 EV << "Unknown Error Type!" << endl;
00082 delete icmpv6Msg;
00083 }
00084
00085 void IPv6ErrorHandling::displayType1Msg(int code)
00086 {
00087 EV << "Destination Unreachable: ";
00088 if (code == 0)
00089 EV << "no route to destination\n";
00090 else if (code == 1)
00091 EV << "communication with destination administratively prohibited\n";
00092 else if (code == 3)
00093 EV << "address unreachable\n";
00094 else if (code == 4)
00095 EV << "port unreachable\n";
00096 else
00097 EV << "Unknown Error Code!\n";
00098 }
00099
00100 void IPv6ErrorHandling::displayType2Msg()
00101 {
00102 EV << "Packet Too Big" << endl;
00103
00104 }
00105
00106 void IPv6ErrorHandling::displayType3Msg(int code)
00107 {
00108 EV << "Time Exceeded Message: ";
00109 if (code == 0)
00110 EV << "hop limit exceeded in transit\n";
00111 else if (code == 1)
00112 EV << "fragment reassembly time exceeded\n";
00113 else
00114 EV << "Unknown Error Code!\n";
00115 }
00116
00117 void IPv6ErrorHandling::displayType4Msg(int code)
00118 {
00119 EV << "Parameter Problem Message: ";
00120 if (code == 0)
00121 EV << "erroneous header field encountered\n";
00122 else if (code == 1)
00123 EV << "unrecognized Next Header type encountered\n";
00124 else if (code == 2)
00125 EV << "unrecognized IPv6 option encountered\n";
00126 else
00127 EV << "Unknown Error Code!\n";
00128 }