00001 #ifndef ICMPV4_H 00002 #define ICMPV4_H 00003 00004 #include "ns3/header.h" 00005 #include "ns3/ptr.h" 00006 #include "ns3/ipv4-header.h" 00007 #include <stdint.h> 00008 00009 namespace ns3 { 00010 00011 class Packet; 00012 00013 class Icmpv4Header : public Header 00014 { 00015 public: 00016 enum { 00017 ECHO_REPLY = 0, 00018 DEST_UNREACH = 3, 00019 ECHO = 8, 00020 TIME_EXCEEDED = 11 00021 }; 00022 00023 void EnableChecksum (void); 00024 void SetType (uint8_t type); 00025 void SetCode (uint8_t code); 00026 00027 uint8_t GetType (void) const; 00028 uint8_t GetCode (void) const; 00029 00030 static TypeId GetTypeId (void); 00031 Icmpv4Header (); 00032 virtual ~Icmpv4Header (); 00033 virtual TypeId GetInstanceTypeId (void) const; 00034 virtual uint32_t GetSerializedSize (void) const; 00035 virtual void Serialize (Buffer::Iterator start) const; 00036 virtual uint32_t Deserialize (Buffer::Iterator start); 00037 virtual void Print (std::ostream &os) const; 00038 00039 private: 00040 uint8_t m_type; 00041 uint8_t m_code; 00042 bool m_calcChecksum; 00043 }; 00044 00045 class Icmpv4Echo : public Header 00046 { 00047 public: 00048 void SetIdentifier (uint16_t id); 00049 void SetSequenceNumber (uint16_t seq); 00050 void SetData (Ptr<const Packet> data); 00051 uint16_t GetIdentifier (void) const; 00052 uint16_t GetSequenceNumber (void) const; 00053 Ptr<const Packet> GetData (void) const; 00054 00055 00056 static TypeId GetTypeId (void); 00057 Icmpv4Echo (); 00058 virtual ~Icmpv4Echo (); 00059 virtual TypeId GetInstanceTypeId (void) const; 00060 virtual uint32_t GetSerializedSize (void) const; 00061 virtual void Serialize (Buffer::Iterator start) const; 00062 virtual uint32_t Deserialize (Buffer::Iterator start); 00063 virtual void Print (std::ostream &os) const; 00064 private: 00065 uint16_t m_identifier; 00066 uint16_t m_sequence; 00067 Ptr<Packet> m_data; 00068 }; 00069 00070 class Icmpv4DestinationUnreachable : public Header 00071 { 00072 public: 00073 enum { 00074 NET_UNREACHABLE = 0, 00075 HOST_UNREACHABLE = 1, 00076 PROTOCOL_UNREACHABLE = 2, 00077 PORT_UNREACHABLE = 3, 00078 FRAG_NEEDED = 4, 00079 SOURCE_ROUTE_FAILED = 5 00080 }; 00081 static TypeId GetTypeId (void); 00082 Icmpv4DestinationUnreachable (); 00083 virtual ~Icmpv4DestinationUnreachable (); 00084 00085 void SetNextHopMtu (uint16_t mtu); 00086 uint16_t GetNextHopMtu (void) const; 00087 00088 void SetData (Ptr<const Packet> data); 00089 void SetHeader (Ipv4Header header); 00090 00091 void GetData (uint8_t payload[8]) const; 00092 Ipv4Header GetHeader (void) const; 00093 00094 private: 00095 virtual TypeId GetInstanceTypeId (void) const; 00096 virtual uint32_t GetSerializedSize (void) const; 00097 virtual void Serialize (Buffer::Iterator start) const; 00098 virtual uint32_t Deserialize (Buffer::Iterator start); 00099 virtual void Print (std::ostream &os) const; 00100 private: 00101 uint16_t m_nextHopMtu; 00102 Ipv4Header m_header; 00103 uint8_t m_data[8]; 00104 }; 00105 00106 00107 class Icmpv4TimeExceeded : public Header 00108 { 00109 public: 00110 enum { 00111 TIME_TO_LIVE = 0, 00112 FRAGMENT_REASSEMBLY = 1 00113 }; 00114 00115 void SetData (Ptr<const Packet> data); 00116 void SetHeader (Ipv4Header header); 00117 00118 void GetData (uint8_t payload[8]) const; 00119 Ipv4Header GetHeader (void) const; 00120 00121 static TypeId GetTypeId (void); 00122 Icmpv4TimeExceeded (); 00123 virtual ~Icmpv4TimeExceeded (); 00124 virtual TypeId GetInstanceTypeId (void) const; 00125 virtual uint32_t GetSerializedSize (void) const; 00126 virtual void Serialize (Buffer::Iterator start) const; 00127 virtual uint32_t Deserialize (Buffer::Iterator start); 00128 virtual void Print (std::ostream &os) const; 00129 00130 private: 00131 Ipv4Header m_header; 00132 uint8_t m_data[8]; 00133 }; 00134 00135 } // namespace ns3 00136 00137 #endif /* ICMPV4_H */